Linq和DeferredEvaluation当你使用LINQ定义一个可枚举集合时,无论你使用LINQ扩展方法还是查询运算符,应用程序实际上并不是在执行LINQ扩展方法构建的收藏。该集合仅在对其进行迭代时被枚举。这意味着原始集合中的数据可以在执行LINQ查询和检索查询标识的数据之间发生变化;您将始终获得最新数据。MicrosoftVisualC#2013StepbyStepbyJohnSharp我写了下面的代码:Listnumbers=newList(){1,2,3,4,5};IEnumerableres=numbers.FindAll(a=>a>0).Select(b=>b).ToList();数字.Add(99);foreach(intiteminres)Console.Write(item+",");上面代码的结果如下:1,2,3,4,5,为什么会这样呢?我知道Func、Action和Predicate,但我不知道这里发生了什么。根据上面的定义,代码是不合理的。除了最后创建新集合的ToList()之外,还有另一个问题。问题是您根本没有使用LINQ。FindAll不是LINQ扩展方法。您应该使用Where:Listnumbers=newList(){1,2,3,4,5};IEnumerableres=numbers.Where(a=>a>0);数字.Add(99);foreach(intiteminres)Console.Write(item+",");先设置一个包含1,2,3,4,5的int类型列表。然后使用linq创建和定义枚举集合。下面描述了linq的工作原理:首先找到所有大于零的数字,正如您看到上面列表中的所有项目都大于零,然后选择所有项目并将它们放入列表中。当你将99添加到数字列表时,它对定义的枚举集合没有影响,因为它创建了一个新集合并传递了其中的项目,并且它没有对数字列表的任何引用。您可以删除linq表达式末尾的.ToList(),结果将是:1,2,3,4,5,99。祝你好运ToList创建List的新实例并将所有项目复制到其中:http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,e276d6892241255bpublicstaticListToList(thisIEnumerablesource){if(source==null)throwError.ArgumentNull("source");返回新列表(来源);所以如果你想在res中有99,你应该将它添加到res,而不是数字:..varres=numbers.Where(a=>a>0)//Filterout;Select是多余的.ToList();res.Add(99);Console.Write(string.Join(",",res));ToList()实际上并不是唯一的问题。FindAll返回一个新列表。因此,当您调用IEnumerableres=numbers.FindAll(a=>a>0)时,它的作用与IEnumerablenewList=newList();相同。foreach(intoldinnumbers){if(old>0)newList.Add(old);因此,当您向图中添加一个新项目时,它就不再相关了。您正在搜索FindAll返回的列表而不是原始列表。如果您推迟ToList()操作(或将ToList()一起删除,直到foreach循环),您将看到预期的结果。ToList将执行与枚举相同的Linq表达式。以上就是《C#学习教程:Linq与延迟求值》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——Listnumbers=newList(){1,2,3,4,5};IEnumerableres=numbers.FindAll(a=>a>0).Select(b=>b);数字.Add(99);foreach(intiteminres)Console.Write(item+",");//另一种选择,但在大多数情况下不是必需的...foreach(intiteminres.ToList())Console.Write(item+",");本文收集自网络,不代表立场。侵权请点击右侧联系管理员删除。如需转载请注明出处:
