@Mister_krid

Как работает разность последовательностей в Linq?

Метод считает разность двух массивов. Я не понимаю как работает Except() ибо он должен удалять повторяющиеся элементы если они есть в двух массивах(списках). Но если я даю ему
{5, 5, 5} - { } он возвращает одну пятерку, а должен три ведь во втором массиве ничего нет значит и удалять он ничего не должен. Объясните пожалуйста.
public int[] ArrayDiff(int[] a, int[] b)
        {
            
            var result = a.Except(b);

            int[] outArray = new int[result.Count()];

           var i = 0;
            foreach (int res in result)
            {               
                outArray[i] = res;
                i++;
            }
            return outArray;
        }
  • Вопрос задан
  • 135 просмотров
Решения вопроса 1
Adler_lug
@Adler_lug
В описание функции не вдавался, но в примере показано, что она работает именно так, как у вас:
double[] numbers1 = { 2.0, 2.0, 2.1, 2.2, 2.3, 2.3, 2.4, 2.5 };
double[] numbers2 = { 2.2 };

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

foreach (double number in onlyInFirstSet)
    Console.WriteLine(number);

/*
 This code produces the following output:

 2
 2.1
 2.3
 2.4
 2.5
*/

Т.е. дублирующиеся значения "сливаются".
Видимо вы не поняли ее конечное назначение.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@oleg_ods
Методы Except, Union, Substruct предназначены для работы с множествами(Set).

Множество, по определению, совокупность уникальных(!) значений.

То есть при вызове метода Except LINQ сначала преобразует массив {5, 5, 5} в множество(удаляет все повторяющиеся элементы => {5}, а после этого вычитает из него в второй массив, который предварительно тоже преобразует в множество(пустое). Соответственно после вычитания результат остается {5}.

Если вам нужно в итоге получать {5, 5, 5} , то нужно пользоваться вариантом предложенным выше. Если делать это нужно часто, то есть смысл написать свое расширение для LINQ.
Ответ написан
@Mister_krid Автор вопроса
если не сложно, объясните разницу между select и where, я понял, то что where возвращает только значения удовлетворяющие условию, а select возвращает ВСЕ значения, но сортируя первыми те которые нам нужны.И момент который я не понял, select возвращает bool, но его все равно используют для получения int, string и т.д.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы