LINQ Count 方法:为什么再次执行查询?

LINQ Count method : why the query is executed again?

我读到 LINQ 非常懒惰...

我有一个 class 型号:

class Movie
    {
        public string Title { get; set; }
        public float Rating { get; set; }

        private int year;
        public int Year
        {
            get
            {
                Console.WriteLine("Returning {0} for movie {1}", year, Title);
                return year;
            }
            set
            {
                year = value;
            }
        }
    }

我有以下代码:

            var movies = new List<Movie>
            {
                new Movie {Title = "The Dark Knight", Rating = 8.9f, Year = 2008 },
                new Movie {Title = "The King's Speech", Rating = 8.0f, Year = 2010 },
                new Movie {Title = "Casablanca", Rating = 8.5f, Year = 1942 },
                new Movie {Title = "Star Wars 5", Rating = 8.7f, Year = 1980 }
            };

            var query = movies.Where(m => m.Year > 2000);
            Console.WriteLine( query.Count( ) );
            foreach(var movie in query)
            {
                Console.WriteLine(movie.Title);
            }

这是输出:

Returning 2008 for movie The Dark Knight
Returning 2010 for movie The King's Speech
Returning 1942 for movie Casablanca
Returning 1980 for movie Star Wars 5
2
Returning 2008 for movie The Dark Knight
The Dark Knight
Returning 2010 for movie The King's Speech
The King's Speech
Returning 1942 for movie Casablanca
Returning 1980 for movie Star Wars 5

那么,Count方法并没有使查询被执行?我认为这与优化相反......那么这背后有合乎逻辑的原因吗? (我看到这种行为的唯一合理原因是 CQS 原则)

谢谢

Count 确实执行了查询。这些是“2”之前的 4 行。 之后的 6 行是 foreach。重新运行查询。

如果令您困惑的是为什么对表达式求值两次。并通过

So, the Count method does not make the query to be executed?

你是说,"Evaluate the conditions and saving the result"。这不是 LINQ 的工作方式。

一般来说,在枚举 LINQ 时,对于请求的每个元素 (MoveNext),LINQ 仅计算新元素。这样它就不会处理不需要的数据。

重新运行相同的 LINQ 表达式将再次遍历元素并重新进行处理。

保存和重复使用结果由您负责。您可以使用 ToArray()ToList()

轻松完成