3

メモリ リストで 2 つのクエリが実行されているとします。

最初のクエリ (拡張メソッドを使用):

var temp = listX.Where(q => q.SomeProperty == someValue);

2 番目のクエリ:

var temp = from o in listX
              where o.SomeProperty == someValue
              select o;

パフォーマンスに関して 2 つのクエリに違いはありますか。もしあれば、なぜですか?

4

3 に答える 3

8

いいえ、まったく違いはありません。コンパイラは、2 番目のバージョンを最初のバージョンに内部的に変換します。

C# 仕様 (§7.6.12) には次のように記載されています。

C# 言語は、クエリ式の実行セマンティクスを指定しません。むしろ、クエリ式は、クエリ式パターン (§7.16.3) に準拠するメソッドの呼び出しに変換されます。具体的には、クエリ式は、 、 、 、 、 、、、およびというWhere名前の メソッドの呼び出しに変換されます。これらのメソッドは、§7.16.3 で説明されているように、特定のシグネチャと結果の型を持つことが期待されます。これらのメソッドは、クエリ対象のオブジェクトのインスタンス メソッドまたはオブジェクトの外部にある拡張メソッドであり、クエリの実際の実行を実装します。SelectSelectManyJoinGroupJoinOrderByOrderByDescendingThenByThenByDescendingGroupByCast

クエリ式からメソッド呼び出しへの変換は、型バインディングまたはオーバーロード解決が実行される前に発生する構文マッピングです。変換は構文的に正しいことが保証されていますが、意味的に正しい C# コードを生成することは保証されていません。クエリ式の変換に続いて、結果のメソッド呼び出しは通常のメソッド呼び出しとして処理されます。これにより、たとえばメソッドが存在しない場合、引数の型が間違っている場合、またはメソッドがジェネリックで型の推論が失敗した場合など、エラーが明らかになる可能性があります。 .

于 2013-02-12T14:41:59.800 に答える
4

違いはありません。同じ時間で同じ結果が得られます。基本的には、構文が異なる同じコードです。

于 2013-02-12T14:42:46.040 に答える
3

短い質問、短い答え:

違いはありません。どちらも同じで、異なる構文で記述されているだけです。

Query Syntax および Method Syntaxについては、MSDN のドキュメントも参照してください。

于 2013-02-12T14:42:52.240 に答える