为什么List.Count()和IEnumerable.Count()会返回不同的结果?

时间:2014-09-26 09:58:14

标签: c# linq list ienumerable

我们在LINQ中有这个数组。

string[] colors = { "green", "brown", "blue", "red" };

并且此代码返回0。

var list = new List<string>(colors);
IEnumerable<string> q3 = list.Where(c => c.Length == 3);
list.Remove("red");
listBox1.Items.Add("Oh! That is : " + q3.Count());

和其他返回1。

var list = new List<string>(colors);
List<string> q3 = list.Where(c => c.Length == 3).ToList();
list.Remove("red");
listBox1.Items.Add("Oh! That is : " + q3.Count());

为什么会这样?列表和Ienumerable之间的差异是什么?

2 个答案:

答案 0 :(得分:19)

Where方法不执行您的查询 - 它只是构建一个查询,然后在请求数据时执行。这称为延迟执行。因此,在您的第一个代码段中,过滤器仅在调用Count()时应用 - 在 <{1}}项目被移除后

在第二个代码段中,您对red的调用会强制立即执行查询以构建新列表。这完全独立于原始列表 - 因此从原始列表中删除项目不会影响结果。

取决于ToList()的声明类型 - 重要的区别是只是q3的调用。因此,如果您将第二个代码段更改为:

ToList()

......你会看到同样的效果。该查询将在删除项目之前执行,此时原始列表与var list = new List<string>(colors); IEnumerable<string> q3 = list.Where(c => c.Length == 3).ToList(); list.Remove("red"); listBox1.Items.Add("Oh! That is : " + q3.Count()); 的内容无关。

有关LINQ的详细信息,您可能需要阅读我的Edulinq blog series

答案 1 :(得分:0)

IEnumerable是一个接口,列表是一个类。
IEnumerable只能存储值,但您无法像添加或删除值一样对其进行编辑。

当您执行.ToList()时,如果您从数据库中选择项目,则正在对数据库执行查询。