web-dev-qa-db-fra.com

Comment fonctionne LINQ Except?

Duplicata possible:
LINQ trouve des différences dans deux listes

Je veux trouver une différence entre 2 séries. J'utilise donc Except dans l'instruction LINQ. Mais Except ne semble fonctionner que lorsque la première collection est plus longue que la seconde. Par exemple, cela ne retournera aucun résultat, même si les 2 collections sont différentes.

double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

IEnumerable<double> onlyInFirstSet = numbers2.Except(numbers1);

Quelqu'un peut-il confirmer si c'est le cas? Si c'est le cas, dois-je vérifier la longueur des collections avant d'écrire la requête, car je ne sais pas quelle collection sera plus importante au moment de la compilation.

Éditer

Je pense que je n'ai pas été clair dans ma question. Je me fiche de savoir quelle collection contient quoi. Je veux juste trouver la différence entre 2 collections. Comment puis-je faire ceci?

29
gunnerz

Extrait de 101 échantillons LINQ :

int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 
int[] numbersB = { 1, 3, 5, 7, 8 }; 

IEnumerable<int> aOnlyNumbers = numbersA.Except(numbersB); 

Console.WriteLine("Numbers in first array but not second array:"); 
foreach (var n in aOnlyNumbers) 
{ 
    Console.WriteLine(n); 
}

Résultat

Numéros du premier tableau mais pas du deuxième tableau: 0 2 4 6 9

47
Dany Marcoux

Par exemple, cela ne retournera aucun résultat ...

C'est correct.

2.2 existe dans la première collection, il n'y a donc rien à retourner.

Cela n'a rien à voir avec la longueur des tableaux.

10
Jim G.

Les autres réponses vous indiquent comment supprimer un ensemble de numéros d'un autre ensemble. En lisant votre question, je pense que vous voulez ce qu'il y a dans le premier mais pas dans le second, et vice-versa:

var numbers1 = new [] { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };
var numbers2 = new [] { 2.2, 2.8 };

var intersect = numbers1.Intersect(numbers2);
var diff = numbers1.Concat(numbers2).Except(intersect);
5
Wasp