Почему 0?
От: BlackEric http://black-eric.lj.ru
Дата: 19.11.17 14:41
Оценка: :)
class Program
    {
        static void Main(string[] args)
        {
            int[] arr = new int[] { 1, 2, 3 };

            int num = 1;

            var st = arr.Where(x => x > num);

            num = 3;

            st = st.Where(x => x < num);

            Console.WriteLine(st.Count().ToString());

            Console.ReadKey();

        }
    }


Почему на консоль выводится 0? Объясните подробно, плз.
https://github.com/BlackEric001
Re: Почему 0?
От: Shmj Ниоткуда  
Дата: 19.11.17 14:54
Оценка: 4 (1) +2
Здравствуйте, BlackEric, Вы писали:

BE>Почему на консоль выводится 0? Объясните подробно, плз.


А так не понятнее: https://dotnetfiddle.net/egwLQp

Выборка отложено производится, только когда вызываете Count. При этом num = 3 и в первом и во втором выражении.
Отредактировано 19.11.2017 14:55 Shmj . Предыдущая версия .
Re: Почему 0?
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 19.11.17 14:56
Оценка: 4 (1) +1
Здравствуйте, BlackEric, Вы писали:


BE>
BE>class Program
BE>    {
BE>        static void Main(string[] args)
BE>        {
BE>            int[] arr = new int[] { 1, 2, 3 };
BE>            int num = 1;
BE>            var st = arr.Where(x => x > num);
BE>            num = 3;
BE>            st = st.Where(x => x < num);
BE>            Console.WriteLine(st.Count().ToString());
BE>            Console.ReadKey();
BE>        }
BE>    }
BE>


BE>Почему на консоль выводится 0? Объясните подробно, плз.


Access of an outer variable will reference the instance of the variable that is active at the time the lambda_expression or anonymous_method_expression is evaluated.


https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/expressions#anonymous-function-expressions
Ce n'est que pour vous dire ce que je vous dis.
Re: Почему 0?
От: Klikujiskaaan КНДР  
Дата: 19.11.17 15:02
Оценка: 4 (1) +3
Здравствуйте, BlackEric, Вы писали:

BE>Почему на консоль выводится 0? Объясните подробно, плз.


Ну тут и замыкание и ленивость в одном флаконе. В момент вычисления результата коллекции 'st' переменная 'num' будет равна 3, т.е. вот тут "arr.Where(x => x > num)" будет так "arr.Where(x => x > 3)"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.