両方のアプローチの利点/欠点はどれですか?
return items.Select(item => DoSomething(item));
対
foreach(var item in items)
{
yield return DoSomething(item);
}
編集MSILはほぼ同等なので、どちらが読みやすいと思いますか?
このyield return
手法により、C#コンパイラは「舞台裏」で列挙子クラスを生成しますが、Select
呼び出しでは、デリゲートでパラメーター化された標準の列挙子クラスが使用されます。Select
実際には、デリゲートの場合、場合によっては追加の呼び出しフレームを除いて、2つの間に大きな違いはありません。
価値があるのは、ラムダをラップすることDoSomething
も無意味です。代理人を直接渡すだけです。
現在、私が望むよりも多くの時間を費やしている動きの遅い企業の世界では、歩留りリターンには、少なくともあと 2 年間はインストールされない真新しい .NET 3.5 フレームワークが必要ないという大きな利点があります。 .
Select では、「アイテム」コレクション内の各アイテムに対して 1 つのオブジェクトのみを返すことができます。追加を使用する.Where(x => DoIReallyWantThis(x))
と、不要なアイテムを取り除くことができますが、アイテムごとに 1 つのオブジェクトしか返すことができません。アイテムごとに複数のオブジェクトが必要になる可能性がある場合は、 を使用できます.SelectMany
が、読みにくい 1 行の長い行に簡単に巻き込まれてしまいます。
「yield return」は、複雑なデータ構造を調べてあちこちの情報を取り出している場合に、コードを読みやすくする可能性を秘めています。私が見た最も良い例は、オブジェクトが返される結果となる約 12 の個別の条件があり、それぞれのケースで返されたオブジェクトが異なる方法で構築されていた場合です。