Как работает LINQ Except?
Возможный дубликат:
LINQ найти различия в двух списках
Я хочу найти разницу между двумя сериями. Поэтому я использую Except
в инструкции LINQ. Но Except
, похоже, работает только тогда, когда первая коллекция длиннее второй. Например, это не вернет никакого результата, даже если две коллекции отличаются.
double[] numbers1 = { 2.0, 2.1, 2.2, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };
IEnumerable<double> onlyInFirstSet = numbers2.Except(numbers1);
Может ли кто-нибудь подтвердить, если это так? Если да, нужно ли проверять длину коллекции до того, как я напишу запрос, потому что я не знаю, какая коллекция будет больше во время компиляции.
Изменить
Я думаю, что в моем вопросе не было ясно. Мне все равно, какая коллекция содержит что. Я просто хочу найти разницу между двумя коллекциями. Как я могу это сделать?
Ответы
Ответ 1
Взято из 101 образцов 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);
}
Результат
Числа в первом массиве, но не во втором массиве:
0
2
4
6
9
Ответ 2
Например, это не вернет результат...
Это правильно.
2.2
существует в первой коллекции, поэтому ничего не вернуть.
Это не имеет никакого отношения к длинам массивов.
Ответ 3
Другие ответы говорят вам, как вы можете удалить набор чисел из другого набора. Читая свой вопрос, я думаю, что вы хотите, что в первом, но не во втором, и наоборот:
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);