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

时间:2016-08-31 22:25:46

标签: c# linq deferred-execution

我读过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原则)

由于

1 个答案:

答案 0 :(得分:2)

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

如果你有什么难题,为什么表达式被评估两次。并通过

  

那么,Count方法不会使查询执行?

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

通常来说,在枚举LINQ时,对于请求的每个元素(MoveNext),LINQ只计算新元素。这样它就不会处理未被要求的数据。

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

储蓄&amp;重用结果就在你身上。您可以使用ToArray()ToList()

轻松完成