Join + IEqualityComparer und HashCode
-
23-09-2019 - |
Frage
Im meine eigenen LINQ Referenz zu schreiben aber ich bin immer Probleme mit einigen der komplizierteren Betreiber-Implementierungen.
Es gibt eine Implementierung Join, die einen IEqualityComparer Im dauert nur verrückt zu bekommen.
Im Versuch, es zu verstehen, bevor ich schreibe (natürlich)
Bild dieser zwei Listen:
List<string> initials = new List<string> {"A", "B", "C", "D", "E"};
List<string> words = new List<string> {"Ant", "Crawl", "Pig", "Boat", "Elephant", "Arc"};
Im Moment seltsam hier. Ich mag beiden Listen wie durch den Anfang, etwas verbinden:
Initial = Ein Wort = Ant
Initial = Ein Wort = Arc
Initial = B Wort = Boot
...
Ich brauche einen Komparator, schrieb ich diese:
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();
}
}
Die Join selbst:
var blah = initials.Join(words,
initial => initial,
word => word,
(initial, word) =>
new {Initial = initial, Word = word},
new InitialComparator());
Es ist das erste Mal, Im mit Hashcodes, nach einer guten Sitzung Debuggen ich sehe, dass jedes Wort, geht an den Komparator und Blick auf seiner HashCode, wenn ein anderes Wort das gleiche HashCode hat es nennt Gleichen.
Da ich nur den anfänglich mich vergleichen will aber, dass ich brauche nur den ersten Buchstaben Hash (Bin ich falsch?)
Die Sache ist, dass dies nicht richtig funktioniert. Sein sagt, dass „Ant“ und „Arc“ gleich ist, Ok, das jedes Wort in der gleichen Liste zu vergleichen oder nicht, aber es fügt nur das letzte Wort es, in diesem Fall Arc, ignoriert Ant und Ant ist gleich zu „A findet "too ...
Wenn ich "Ant" setzen und "Ant" es beide hinzuzufügen.
Kurz gesagt, Was ist die Art und Weise so etwas zu tun? Ich weiß, dass Im etwas falsch zu machen.
Danke.
Lösung
Wie Crispy erwähnt try x [0] == y [0] anstatt x.StartsWith (y); Das funktioniert für mich.
Andere Tipps
Sie haben nicht wirklich Ihren eigenen Gleichheitsvergleich benötigen, kommen Sie einfach auf den einzelnen Buchstaben wie folgt:
var mine = from i in initials join w in words on i[0] equals w[0] select new { Initial = i, Words = w };
Ich bin mir nicht sicher, warum Sie dieses Verhalten sind zu sehen, aber ich denke, mit „Select“ wäre ein einfacher Ansatz und (noch wichtiger) hat das Verhalten Sie wollen:
var blah =
from word in words
from initial in initials
where (word.StartsWith(initial))
select new { Initial = initial, Word = word };
Ich ziehe das Verständnis Syntax, wo möglich zu verwenden. „Select“ wird aufgerufen, wenn es mehr „von“ Klauseln in einem Verständnis Abfrage.