LINQ计数方法:查询再次执行的原因

本文关键字:执行 查询 方法 LINQ | 更新日期: 2023-09-27 18:05:07

我读到LINQ是非常懒惰的…

我有一个类与一个模型:

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原则)

谢谢

LINQ计数方法:查询再次执行的原因

Count是否执行了查询。这是"2"之前的4行。后面的6行是foreach。重新运行查询。

如果让你困惑的是为什么表达式求值两次。和

所以,Count方法不执行查询?

你的意思是"评估条件并保存结果"。这不是LINQ的工作方式。

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

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

保存,重用结果取决于您。您可以使用ToArray()ToList()