44 votes

C#: Comparer le contenu de deux IEnumerables

Est-il intégré dans la méthode linq chose que je peux utiliser pour savoir si deux séquences contient les mêmes éléments, ne prenant pas en compte la commande?

Par exemple:

{1, 2, 3} == {2, 1, 3}
{1, 2, 3} != {2, 1, 3, 4}
{1, 2, 3} != {1, 2, 4}

Vous avez la SequenceEquals, mais alors que j'aurais à la fois des séquences d'abord, n'aurais-je pas?

45voto

leppie Points 67289

Il y a assez peu de moyens. Supposons A et B est IEnumerable.

A.Except(B).Count() == 0 && B.Except(A).Count() == 0
A.Count() == B.Count() && A.Intersect(B).Count() == B.Count()
etc

9voto

Yoann Points 11

Avec deux IEnumerables (A et B) :

bool equal = (A.Count() == B.Count() && (!A.Except(B).Any() || !B.Except(A).Any()))

Je pense que c'est mieux qu'à l'Exception de(Un).Compter parce que l'ensemble de l'Exception ne sera pas évaluée. Il s'arrêtera dès qu'un élément est présent dans l'Exception. Avec le Comte, l'ensemble de l'Exception est évaluée. En plus de cela, nous pouvons éviter l'évaluation de ces coûteux, Sauf en consultant le Comte propriétés de la première. Si les Comptages ne sont pas Égaux, alors nous vérifions les Extraits.

3voto

Rauhotz Points 3155

Essayez la classe HashSet:

var enumA = new[] { 1, 2, 3, 4 };
var enumB = new[] { 4, 3, 1, 2 };

var hashSet = new HashSet<int>(enumA);
hashSet.SymmetricExceptWith(enumB);
Console.WriteLine(hashSet.Count == 0); //true => equal

Mais cela ne veut ne fonctionnera correctement que si les valeurs sont distinctes.

Par exemple

var enumA = new[] { 1, 1, 1, 2 };
var enumB = new[] { 1, 2, 2, 2 };

sont également considérés comme des "égaux" l'esprit de la méthode mentionnée.

1voto

Mehrdad Afshari Points 204872

Je pense que la commande de la séquence est le moyen le plus rapide vous pouvez atteindre cet objectif.

1voto

Bob The Janitor Points 5526

Je l'ai fait pour la fusion de nouveaux éléments dans une collection sans doublons, il prend deux collections et renvoie tous les éléments avec toutes les doublons

List<Campaign> nonMatching = (from n in newCampaigns 
where !(from e in Existing select e.Id).Contains<int>(n.Id) 
select n).ToList<Campaign>();

Maintenant, par la suppression de la ! pour la mention " contient

List<Campaign> nonMatching = (from n in newCampaigns 
where (from e in Existing select e.Id).Contains<int>(n.Id) 
select n).ToList<Campaign>();

il sera de retour les doublons

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X