为什么IEnumerable慢而List快?遇到了这段代码。vardic=新字典();for(inti=0;if.Value.StartsWith("1")).Select(f=>f.Key);//.ToList();//取消注释以获得快速结果Console.WriteLine(list.GetType());varlist2=dic.Where(f=>list.Contains(f.Key)).ToList();Console.WriteLine(list2.Count())所以当.ToListWhen()被评论时它很慢,当没有时-它很快。这里如何解释再现性?我是否应该总是为了速度而制作所有ToList()(即在哪些情况下IEnumerable更可取)?注意我只是在谈论对象的linq,我知道linq对sql和东西很懒惰。这是因为延迟执行:当您注释掉ToList时,枚举是通过评估字典中每个项目的过滤器序列生成的。但是,当您执行ToList时,序列在内存中“具体化”,因此所有评估仅执行一次。第二个没有ToList的逻辑如下://逻辑展开仅供说明。varlist2=new列表>();foreach(vardindict){varlist=newList();//这个嵌套循环在每次迭代中做同样的事情,//重做n次本来只能做一次的事情。foreach(varfindict){if(f.Value.StartsWith("1")){list.Add(f.Key);}}if(list.Contains(d.Key)){list2.Add(d);}}ToList的逻辑如下://列表准备一次,不用管varlist=newList();foreach(varfindict){if(f.Value.StartsWith("1")){list.Add(f.Key);}}varlist2=newList>();//此循环在其所有迭代中使用相同的列表。foreach(vardindict){if(list.Contains(d.Key)){list2.Add(d);如您所见,ToList将带有两种大小的具有n个嵌套循环的O(n^2)程序转换为O(2*n),每个循环的大小为n。LINQ使用延迟执行。查询的结果永远不会存储在任何地方,除非您调用.ToList();相反,它会在每次迭代结果时重新迭代查询。通常,这要快得多;通常没有理由先将所有结果存储在内存中。但是,您的代码重复查询;每次调用Where()回调一次。您应该用Join()调用而不是ToList()调用替换该行,它将比任何一种方法都快。因为当您没有.ToList()调用时,list2实例化将遍历字典中每个项目的整个可枚举列表。因此,如果您使用延迟执行,则从O(n)到O(n^2)。这是延迟执行造成的。IEnumerable不一定是静态集合。通常它是一些数据源(在你的情况下为dic)+导致最终集合的所有方法和表达式(Where、Contains等)。.ToList()执行所有这些方法和表达式并产生最终结果。因此,如果您使用ToList(),它会生成一个标准的.NET列表(整数数组)并对该列表执行所有操作。无需调用ToList()(或任何其他To方法)即可多次枚举IEnumerable。以上就是C#学习教程:为什么IEnumerable慢,List快?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
