C#では、ラムダ関数でイテレーターブロックを表すことはできません(たとえば、ラムダ関数内で「yieldreturn」を使用することはできません)。たとえば、列挙時にすべてのドライブを生成するレイジー列挙可能オブジェクトを作成したい場合は、次のようなことを行います。
IEnumerable<DriveInfo> drives = {foreach (var drive in DriveInfo.GetDrives())
yield return drive;};
しばらく時間がかかりましたが、その機能を取得する方法としてこれを理解しました。
var drives = Enumerable.Range(0, 1).SelectMany(_ => DriveInfo.GetDrives());
もっと慣用的な方法はありますか?
次のような独自のメソッドを作成してみませんか。
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);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加