6

C# 不允许 lambda 函数表示迭代器块(例如,在 lambda 函数内不允许“yield return”)。例如,如果我想创建一个在枚举时产生所有驱动器的惰性枚举,我想做类似的事情

IEnumerable<DriveInfo> drives = {foreach (var drive in DriveInfo.GetDrives()) 
                                     yield return drive;};

花了一段时间,但我认为这是获得该功能的一种方式:

var drives = Enumerable.Range(0, 1).SelectMany(_ => DriveInfo.GetDrives());

有没有更惯用的方法?

4

2 回答 2

1
 var drives = new Func<IEnumerable<DriveInfo>>(DriveInfo.GetDrives);

 foreach(var drive in drives())
     Console.WriteLine(drive);

该解决方案有一个重要特点;它认识到多重枚举可能是潜在的坏事。例如,底层枚举器可能会创建列表的快照,然后只枚举列表。还有其他关于多枚举器的讨论请参阅此处此处的答案

于 2013-09-22T15:03:32.517 回答
1

为什么不编写自己的方法,例如:

public static IEnumerable<T> GetLazily<T>(Func<IEnumerable<T>> getSource)
{
  foreach (var t in getSource())
    yield return t;
}

或者:

public static IEnumerable<T> GetLazily<T>(Func<IEnumerable<T>> getSource)
{
  return (new int[1]).SelectMany(_ => getSource());
}

它应该允许这样的用法:

var drives = GetLazily(DriveInfo.GetDrives);
于 2013-09-22T15:33:03.150 回答