并发或性能返回列表时yield收益的好处

ben*_*wey 19 c# yield enumerators

我想知道使用yield return而不是返回列表是否存在任何并发(现在或将来)或性能优势.请参阅以下示例

处理方法

void Page_Load()
{
  foreach(var item in GetPostedItems())
    Process(item);
}
Run Code Online (Sandbox Code Playgroud)

使用收益率回报

IEnumerable<string> GetPostedItems()
{
  yield return Item1.Text;
  yield return Item2.Text;
  yield return Item3.Text; 
}
Run Code Online (Sandbox Code Playgroud)

返回一个清单

IEnumerable<string> GetPostedItems()
{
  var list = new List<string>();
  list.Add(Item1.Text);
  list.Add(Item2.Text);
  list.Add(Item3.Text);
  return list;
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*tes 40

在该yield return示例中,在每次调用时评估结果,IEnumerable.MoveNext而在列表示例中,在IEnumerable返回之前评估所有结果(请注意,Text可能不会为每个结果评估属性,因为可以进行缓存和内联).因此,yield return您应该在第一次调用枚举器时获得较小的性能增强,然后在IEnumerable.MoveNext评估属性时对每次后续调用可能会略微降低性能.

其中一个重要的事情yield return是,您可以返回无限序列,随机序列和各种其他新颖的枚举,这些枚举要么是效率极低,要么无法使用先创建列表的模型.

简单地说,返回一个实例List需要在返回之前评估列表中的所有元素IEnumerable,而using yield return允许按照消费者的需要计算每个元素IEnumerable.

  • 这将取决于列表的元素是什么以及评估每个值花了多少精力.如果列表中的每个元素都涉及打开一个500MB的文件,那么我会选择yield return方法,如果它只是一个简单的计算,那么列表可能会更好. (4认同)
  • 当您想要遍历文件系统时,yield return非常有用. (2认同)