【发布时间】:2014-01-26 22:02:34
【问题描述】:
最近,我遇到了一个奇怪的问题,我有一个方法可以生成 IEnumerable 对象集合。此方法包含返回四个对象的四个yield return 语句。我使用 var 关键字将结果分配给变量 results。
var result = GenerateCollection().ToList();
这实际上意味着:List<MyType> result = GenerateCollection()。
我对这个集合的元素做了一个简单的 for 循环。令我惊讶的是,每次调用列表(每个result[i])都会重新枚举该集合。后来我在一个 LINQ 查询中使用了result 集合,由于集合的不断重新枚举,它在性能方面产生了一些不好的结果。
我通过转换为数组而不是列表解决了这个问题。
这让我现在想知道的是什么时候枚举集合?哪些方法调用使集合重新枚举?
编辑:GenerateCollection() 方法看起来与此类似:
public static IEnumerable<MyType> GenerateCollection()
{
var array = data.AsParallel(); //data is a simple collection of sublists of strings
yield return new MyType("a", array.Where(x => x.Sublist.Count(y => y == 'a') == 0));
yield return new MyType("b", array.Where(x => x.Sublist.Count(y => y == 'b') == 0));
yield return new MyType("c", array.Where(x => x.Sublist.Count(y => y == 'c') == 0));
yield return new MyType("d", array.Where(x => x.Sublist.Count(y => y == 'd') == 0));
}
【问题讨论】:
-
请展示 GenerateCollection 方法的实现以及重现问题的每个循环
-
MyType看起来如何?构造函数的第二个参数有什么作用? -
它基本上是一个字符串的元组和一个字符串列表。
-
正如我在 SO 上可能已经说过一百次了:如果我只能告诉人们关于 LINQ 的一件事,那就是查询表达式产生一个 query 而不是 结果集。您正在提出一系列问题,而不是一系列答案。
标签: c# linq collections ienumerable yield-return