Rez*_*ady 7 c# linq ienumerable list
我们在LINQ中有这个数组.
string[] colors = { "green", "brown", "blue", "red" };
Run Code Online (Sandbox Code Playgroud)
这段代码返回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());
Run Code Online (Sandbox Code Playgroud)
和其他返回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());
Run Code Online (Sandbox Code Playgroud)
为什么会这样?列表和Ienumerable之间的差异是什么?
Jon*_*eet 19
该Where方法不执行您的查询 - 它只是构建一个查询,然后在请求数据时执行该查询.这称为延迟执行.因此,在你的第一个片段,该过滤器只在Count()被称为-这是后该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());
Run Code Online (Sandbox Code Playgroud)
......你会看到同样的效果.在删除项目之前将执行查询,此时原始列表与内容无关q3.
有关LINQ的详细信息,您可能需要阅读我的Edulinq博客系列.
IEnumerable是一个接口,列表是一个类。
并且IEnumerable只能存储值,但不能像添加或删除值一样对其进行编辑。
此外,当您执行.ToList()此操作时,如果您从数据库中选择项目,则会在数据库上执行查询。