IEnumerableを扱う諸々について
IEnumerable<TSource> を返すメソッドだからといって、こんなことをしていると凄い遅いコードが出力されます。
yield return new TSource();
yield return new TSource();
yield return new TSource();
プログラムの大半はループで構成されているのですから、ループが速くて悪いという事はありません。
メソッドの内部は、最も効率の良い具象型を用いましょう。ちなみに、上記のコードの最速例は以下のようになります。
return new[] {
new TSource(),
new TSource(),
new TSource()
};
可読性の点では問題ありませんし、yield return を並べるよりは良い動きをします。外部からはIEnumerable<TSource>なので、インターフェース面の問題もありません。
また、MicrosoftはLINQは具象型の種類に応じた個別の最適化を実装しています。 おおまかには、TSource配列、List<TSource>、IEnumerable<TSource>の順で速い実装が本当にあるのです。
http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs#38
C#で高速なコードを書くには、配列を嫌いにならないことが結構肝心です。
List<T>の内部も他のコレクションも内部的にはほとんどが配列です。
遅延評価することが重要といわれる局面でのみ、本当の意味でのIEnumerableが必要となるわけです。