Pourquoi SequenceEqual pour une Liste<T> renvoie false?
Salut j'ai quelques problèmes avec sequenceEqual quand j'ai ce genre de situation:
Sentence s1 = new Sentence { Text = "Hi", Order = 1 };
Sentence s2 = new Sentence { Text = "Hello", Order = 2 };
List<Sentence> list1 = new List<Sentence> { s1, s2 };
List<Sentence> list2 = new List<Sentence> { s1, s2 };
et cela fonctionne bien
bool equal = list1.SequenceEqual(list2);
et retourne true
;
mais quand j'ai une méthode qui retourne List<Sentence>
par exemple:
public List<Sentence> Getall()
{
Sentence s1 = new Sentence { Text = "Hi", Order = 1 };
Sentence s2 = new Sentence { Text = "Hello", Order = 2 };
return new List<Sentence> { s1, s2 };
}
et de l'utiliser comme ceci:
List<Sentence> list1 = Getall();
List<Sentence> list2 = Getall();
et puis tout simplement, vérifier
bool equal = list1.SequenceEqual(list2);
il renvoie 'false', s'il vous plaît dites-moi pourquoi? et comment le faire fonctionner?
Parce que dans le deuxième scénario, ils sont différents des objets, c'est à dire leur GetHash() méthodes retournent des valeurs différentes. Dans le premier cas, ils sont exactement la même objets à l'aide de deux références.
OriginalL'auteur Tomasz Kowalczyk | 2013-02-19
Vous devez vous connecter pour publier un commentaire.
Votre problème est que l'on
new Sentence { Text = "Hi", Order = 1 }
n'est pas égal à un autrenew Sentence { Text = "Hi", Order = 1 }
. Bien que le contenu est le même, vous avez deux objets distincts, et, sauf si vous avez conçu votre classe, sinon, ils ne sont pas égaux les uns aux autres, sauf s'ils sont littéralement les mêmes objets (comme dans votre premier exemple).Votre
Sentence
les besoins de la classe pour remplacerEquals
etGetHashCode
, à tout le moins, à quel point votreSequenceEquals
devrait fonctionner à nouveau.Cette réponse était proche, mais Patryk Ćwiek de la réponse qui a recommandé l'utilisation de IEqualityComparer a été la solution pour moi.
OriginalL'auteur Rawling
Comme le MSDN unis ici:
Sentence
dans votre cas est un type de référence par défautEquals
etGetHashCode
, ce qui signifie qu'il sera en utilisant le référentiel de l'égalité pour chaque élément.Vous pouvez toujours utiliser le une surcharge qui accepte
IEqualityComparer
OriginalL'auteur Patryk Ćwiek
Vous êtes à la création de deux nouvelles instances de la Peine chaque fois que vous appelez
Getall()
. Lorsque l'on compare les éléments dans la liste,SequenceEqual
utilisent par défaut le comparateur d'égalité, qui, fondamentalement, il suffit de vérifier qu'ils se réfèrent à la pme de l'objet: ils ne sont pas, de sorte qu'ils sont différents.Ce que vous pouvez faire est de remplacer le
Equal()
et==
opérateurs dans la Séquence de l'égalité de vérifier d'autres propriétés (comme du Texte et de l'Ordre).Alternativement, vous pouvez écrire un
IEqualityComparer<Sequence>
et de le passer àSequenceEqual
OriginalL'auteur Tallmaris