Отложенное выполнение. Метод Where в C#

1 отзыв

where c# linq

В пространстве имен System.Linq есть замечательный метод Enumerable.Where<TSource>, который позволяет на основе заданного предиката фильтровать имеющиеся в коллекции значения и возвращать уже отфильтрованную коллекцию.

Казалось бы, коллекцию мы отфильтровали, далее мы можем с ней делать все, что угодно 🙂 , ну например, очистить или, скажем, приравнять null, нам так захотелось. Вот именно тут ожидает самое интересное.

Для примера создадим консольное приложение, в котором будем рассматривать варианты работы с методом Where. В этом приложении создадим такой класс:

Затем наполним файл Programm.cs, например, таким кодом:

Итак, в первом варианте (метод ListClear()) мы заполняем коллекцию каким-то данными, затем методом Where ищем, например, канал с Id = 3, а затем очищаем коллекцию. Во втором случае (метод GetFirstAndClear()) мы помимо предыдущих действий еще и требуем возвращения первого элемента коллекции. Посмотрим, что же у нас получилось:
where c# example
В первом варианте, как видно на картинке, у нас ничего не нашлось, а во втором — вернулся правильный результат. Все дело в том, что метод Where обладает свойством отложенного выполнения. То есть когда мы его вызвали, мы дали указание, что делать в будущем, когда полученная отфильтрованная коллекция tvEnum будет вызвана для, например, подсчета полученных значений. В первом случае перед непосредственными действиями с ней мы очистили исходную коллекцию tvList. И когда последовал вызов метода подсчета элементов отфильтрованной коллекции Count(), последний совершенно справедливо вернул 0.

Во втором же случае мы после выполнения метода Where сразу обратились к коллекции методом First. На экране консоли во втором случае вернулось ожидаемое значение.

Согласно ссылке на сайт Microsoft код, получаемый при вызове метода Where для List, выглядит так:

Как видно, просто заполняются некие поля и на этом все заканчивается. Стоит только вызвать любой метод, обращающийся к данной коллекции, как вызывается метод, переданный делегату predicate. Например, в случае вызова метода First() вызывается метод MoveNext() коллекции, который в свою очередь обращается в элементам коллекции посредством метода, ссылка на который передана в делегат predicate.

Подпишитесь на обновления блога!


Один ответ “Отложенное выполнение. Метод Where в C#”

  1. Ленивые вычисления касаются и такого метода Linq как Take. Вот, например, такой код вернет false:

    List strList = new List() { «1», «2», «3», «4» };
    IEnumerable part = strList.Take(2);
    strList.RemoveRange(0, 2);
    bool isNumberExists = part.Any(x => x == «1»);
    return isNumberExists;

    , а такой — true:

    List strList = new List() { «1», «2», «3», «4» };
    IEnumerable part = strList.Take(2);
    bool isNumberExists = part.Any(x => x == «1»);
    strList.RemoveRange(0, 2);
    return isNumberExists;

    http://noservice.ru/wp-content/plugins/wp-monalisa/icons/wpml_bye.gif

    Ответить

Оставьте комментарий

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url=""> <img src="" alt="" class="" width="" height="">

http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ab.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ac.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ag.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ah.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ai.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ak.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/am.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/an.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ao.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/aq.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ar.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/at.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/av.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/aw.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ay.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/az.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bb.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bc.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bd.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/be.gif 
больше...