LinQ in C#, why does query sentence must convert to tolist()?
我有以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | class Program { private static List<Member> members = new List<Member> { new Member() {m_FirstName ="Chiristopher", m_LastName="Harrison"}, new Member() {m_FirstName ="Jeremy", m_LastName = "Foster"}, new Member() {m_FirstName ="Stacey", m_LastName ="Mulcahy"} }; static void Main(string[] args) { var result = (from m in members where m.m_LastName.Length > 6 select m); Console.WriteLine("** First Execution **"); foreach(var member in result) { Console.WriteLine(member); } members.Add(new Member() { m_FirstName ="Rian", m_LastName ="ThyTuhfadsl" }); Console.WriteLine("** Second Execution **"); foreach (var member in result) { Console.WriteLine(member); } } } |
当我建造它的时候:慰问:**首次执行**克里斯托弗·哈里森斯泰西穆卡西**第二次执行**克里斯托弗·哈里森斯泰西穆卡西里安·泰图法兹尔
如果我调试,结果变量的第一个值是3,但它只打印两个值。为什么?
第二个是四个值。不过,我没有重新输入任何代码
如果我打字
1 2 3 | var result = (from m in members where m.m_LastName.Length > 6 select m).toList(); |
在任何情况下都只有两个值。
LINQ查询可以是几种类型,如.NET中所定义的:
- 用于Linq to Objects的
IEnumerable 。 - 用于Linq to SQL的
IQueryable - 用于PLINQ的
ParallelQuery - 等等…
在您的例子中,您使用的是linq to对象,所以
我们说查询的计算比较慢。第二次枚举它时,它将被重新评估。如果您调用
因为LINQ查询的计算比较慢。大多数LINQ查询方法返回一个
除了其他人所说的,如果我正确理解你的问题,你所说的3个结果值指的是
1 2 3 4 5 | private class WhereListIterator<TSource> : Enumerable.Iterator<TSource> { private List<TSource> source; private Func<TSource, bool> predicate; private List<TSource>.Enumerator enumerator; |
所以你的代码是正确的
在第一个代码示例中,您枚举原始列表两次。
但是,当您用最后一个代码示例替换LINQ查询时,您将复制原始序列。linq方法tolist将序列的副本复制到
这与LINQ查询的延迟评估有关。如果在LINQ查询之后编写
这是"懒惰执行"的一部分,您可以在线搜索。
直到需要时才执行查询。(仅当您迭代它时)。
".tolist()"命令强制执行查询。