19

我想知道是否有任何并发​​性(现在或将来),或者使用收益返回而不是返回列表是否有性能优势。请参阅以下示例

处理方法

void Page_Load()
{
  foreach(var item in GetPostedItems())
    Process(item);
}

使用收益回报

IEnumerable<string> GetPostedItems()
{
  yield return Item1.Text;
  yield return Item2.Text;
  yield return Item3.Text; 
}

返回列表

IEnumerable<string> GetPostedItems()
{
  var list = new List<string>();
  list.Add(Item1.Text);
  list.Add(Item2.Text);
  list.Add(Item3.Text);
  return list;
}
4

1 回答 1

41

yield return示例中,每次调用时都会评估结果,IEnumerable.MoveNext而在列表示例中,在返回之前评估所有结果IEnumerable(请注意,Text可能不会为每个结果评估属性,因为可能会发生缓存和内联)。因此,yield return您应该在第一次调用枚举器时获得小幅性能提升,然后在IEnumerable.MoveNext评估属性时每次后续调用时可能会有小幅性能下降。

其中一件很棒的事情yield return是,您可以返回无限序列、随机序列和各种其他新颖的枚举,这些枚举对于首先创建列表的模型来说效率极低或不可能。

简而言之,返回 的实例List需要在返回 之前评估列表中的所有元素IEnumerable,而 usingyield return允许根据消费者的要求计算每个元素IEnumerable

于 2008-11-16T16:44:34.273 回答