Question

Im écrire ma propre LINQ référence, mais Im obtenir quelques problèmes avec certains de la plus complexe des opérateurs de mise en œuvre.

Il y a une Jointure de mise en œuvre qui prend un IEqualityComparer Im obtenir tout simplement fou.

Im essayant de comprendre d'abord avant d'écrire (bien évidemment)

L'Image de ces deux listes:

List<string> initials = new List<string> {"A", "B", "C", "D", "E"};

List<string> words = new List<string> {"Ant", "Crawl", "Pig", "Boat", "Elephant", "Arc"};

Rien de bizarre ici.Je tiens à joindre les deux listes, la première, quelque chose comme:

Initiale=Un Mot=Ant
Initiale=Un Mot=Arc
Initiale=Mot B=Bateau
...

J'ai besoin d'un comparateur, j'ai écrit ceci:

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();
    }
}

Le Rejoindre lui-même:

var blah = initials.Join(words,
                                  initial => initial,
                                  word => word,
                                  (initial, word) =>
                                  new {Initial = initial, Word = word},
                                  new InitialComparator());

C'est la première fois que Im en utilisant HashCodes, après une bonne session de débogage je vois que chaque mot aller à la comparaison et de regarder son HashCode, si un autre mot a le même HashCode il appelle égal à égal.

Depuis que j'ai envie de comparer l'initiale je l'ai bien que j'ai juste besoin de la première lettre de Hachage (je me trompe?)

Le truc, c'est que cela ne fonctionne pas correctement.Sa dit que "Fourmi" et "Arc" sont égaux, Ok, sa comparaison de chaque mot dans la liste ou pas, Mais il ajoute que le dernier mot qu'il trouve, dans ce cas, l'Arc, en ignorant les Fourmis et les Fourmis) est égal à "A" de trop...

Si j'ai mis "Fourmi" et "Ant" il ajouter à la fois.

En bref, Quel est le moyen de faire quelque chose comme ça?Je sais que je fais quelque chose de mal.

Je vous remercie.

Était-ce utile?

La solution

Comme Croustillante mentionné essayer x[0] == y[0] au lieu de x.StartsWith(y);Ce qui a fonctionné pour moi.

Autres conseils

Vous n'avez pas réellement besoin de votre propre comparateur d'égalité, vient se joindre à la lettre de la sorte:

var mine = from i in initials
     join w in words on i[0] equals w[0]
     select new {
          Initial = i,
          Words = w
     };

Je ne suis pas sûr de savoir pourquoi vous voyez ce comportement, mais je pense que l'utilisation d' "SelectMany" serait une approche plus directe et (plus important) a le comportement que vous souhaitez:

var blah =
    from word in words
    from initial in initials
    where (word.StartsWith(initial))
    select new { Initial = initial, Word = word };

Je préfère utiliser la compréhension de la syntaxe, si possible."SelectMany" est invoquée lorsqu'il y a plusieurs "à partir de" clauses de compréhension de la requête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top