我们在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之间的差异是什么?
答案 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()
时,如果您从数据库中选择项目,则正在对数据库执行查询。