参加+IEqualityComparer<T> とHashCode
-
23-09-2019 - |
質問
Im書を自分のLINQがーのトラブルにより複雑な事業者の実装方法です。
が参加実施にかかるIEqualityComparer ーで狂いにくくなっております。●
Im理解しようとなっていることが考えられた書(か)
画像のリスト:
List<string> initials = new List<string> {"A", "B", "C", "D", "E"};
List<string> words = new List<string> {"Ant", "Crawl", "Pig", "Boat", "Elephant", "Arc"};
何か。また、私は両方のリストによる初期のようなもの:
初期=A Word=Ant
初期=A Word=アーク
初期=B Word=ボート
...
いおり、コンパレータ、書いた本
public class InitialComparator : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
return x.StartsWith(y);
}
public int GetHashCode(string obj)
{
return obj[0].GetHashCode();
}
}
の参加そのもの:
var blah = initials.Join(words,
initial => initial,
word => word,
(initial, word) =>
new {Initial = initial, Word = word},
new InitialComparator());
これに対し、今回のIm用ュー内の後、良いセッションのデバッグのいたように、これまでとは違ったすべてのコンパレータで、そのハッシュコードが別の単語と同じハッシュコードでequals.
たいので比較では、当初私はもう必要性のハッシュ文字(か)
ものであることがうまくいきません。そのう"Ant"や"Arc"のequals、Ok、その比較はすべて同じリストではないですが、追加しみにできるようにするためのlibsoupお、この場合にアークを無視してAnt、Antは、equalsの"A"---。
を置い"Ant"と"Ant"で追加します。
にのって何かをするのはいけないと思います。知っているImって何かをするのが間違っている。
お願い致します。
解決
クリスピーは、tryを述べたように X [0] == Y [0] の代わりに x.StartsWith(Y)。 それは私のために働いています。
他のヒント
あなたが実際にはそうのような個々の文字に参加し、独自の等値比較子を必要としません。
var mine = from i in initials join w in words on i[0] equals w[0] select new { Initial = i, Words = w };
私は確かに、なぜあなたはこの動作を見ているではないんだけど、私はもっと簡単な方法だろう「SelectMany」を使用して考えると、(もっと重要なのは)あなたが望む行動があります:
var blah =
from word in words
from initial in initials
where (word.StartsWith(initial))
select new { Initial = initial, Word = word };
私は可能な限り理解の構文を使用することを好みます。 「SelectManyは」理解クエリ内の句「から」が複数あるときに呼び出されます。