まず、この質問がこのコミュニティに適合するかどうかはわかりません。それはそれをどこに移動するには:)パフォーマンスの違い/カスタムLinq拡張による改善
をだから、私に教えてくださいしていない場合、私は自分自身が非常に頻繁にこのようにLINQの式を書いてキャッチしました:
var xy = someSource.Where(x => x.Property == value).Select(x => new Y(x));
私のコードをリファクタリングするとき、私は、これは実際に私を列挙思いましたソースは二回、私はこの小さな拡張(実際には、あまりにも何も特別な)を書いた:
public static IEnumerable<TResult> SelectWhere<TIn, TResult>(this IEnumerable<TIn> source,
Func<TIn, bool> predicate, Func<TIn, TResult> selector)
{
foreach (var item in source)
{
if (predicate(item))
{
yield return selector(item);
}
}
}
だから私は
var xy = someSource.SelectWhere(x => x.Property == value, x => new Y(x));
と私のクエリを置き換えることができます210
もちろん、ソースの列挙型が大きい場合や、それぞれの「次へ移動」に時間がかかる場合は、パフォーマンスが大幅に向上します(まったくの場合)。
私の質問は次のとおりです。パフォーマンス(やや)、この拡張機能を持つ価値はありますか?
「私はこれが実際に私のソースを2回列挙したと思ったのですが、どうしてそう思いますか? –
私はそう思っています。なぜなら、 'Where'と' Select'の両方が彼らの行動を実行するために列挙する必要があるからです。 – Stefan
@Stefan:いいえ、 'Where'と' Select'は* lazy *ですが、列挙する必要はありません。 –