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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top