Подтвердить что ты не робот

Как работает 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);

Может ли кто-нибудь подтвердить, если это так? Если да, нужно ли проверять длину коллекции до того, как я напишу запрос, потому что я не знаю, какая коллекция будет больше во время компиляции.

Изменить

Я думаю, что в моем вопросе не было ясно. Мне все равно, какая коллекция содержит что. Я просто хочу найти разницу между двумя коллекциями. Как я могу это сделать?

4b9b3361

Ответ 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);