2

コレクションのWhere()メソッドを使用する場合と、LinQを使用してフィルター処理する場合に違いはありますか?

すなわち、

初め

var numQuery = from num in numbers
               where (num % 2) == 0
               select num;

2番

var numQuery = numbers.Where(num => num % 2 == 0);

上記のクエリでは、どちらが良いですか?また、パフォーマンスに関する考慮事項はありますか?

ありがとう。

4

3 に答える 3

6

違いはありません。最初のものはQuery TypeLINQです。2つ目はExtension Methodタイプです。多くの機能が組み込まれているので、2番目のものをお勧めします。

以下のリンクから

「...ただし、メソッド構文とクエリ構文の間に意味上の違いはありません。」

MSDN:LINQクエリ構文とメソッド構文(C#)

于 2012-09-06T02:10:24.277 に答える
5

いいえ、違いはまったくありません(ジョンが指摘したように)。

信じたくない人を納得させるために、私はどのILコードが生成されるかを確認しましたが、まったく同じです(好奇心旺盛な人のために以下に投稿されています)。


IL_0001:  ldc.i4.4    
IL_0002:  newarr      System.Int32
IL_0007:  dup         
IL_0008:  ldtoken     {A078DB01-D7BE-45F4-8D98-8D2FA673C282}.$$method0x6000001-1
IL_000D:  call        System.Runtime.CompilerServices.RuntimeHelpers.InitializeArray
IL_0012:  stloc.0     
IL_0013:  ldloc.0     
IL_0014:  ldsfld      UserQuery.CS$9__CachedAnonymousMethodDelegate1
IL_0019:  brtrue.s    IL_002E
IL_001B:  ldnull      
IL_001C:  ldftn       b__0
IL_0022:  newobj      System.Func..ctor
IL_0027:  stsfld      UserQuery.CS$9__CachedAnonymousMethodDelegate1
IL_002C:  br.s        IL_002E
IL_002E:  ldsfld      UserQuery.CS$9__CachedAnonymousMethodDelegate1
IL_0033:  call        System.Linq.Enumerable.Where
IL_0038:  stloc.1     
IL_0039:  ldloc.1     
IL_003A:  call        LINQPad.Extensions.Dump

b__0:
IL_0000:  ldarg.0     
IL_0001:  ldc.i4.2    
IL_0002:  rem         
IL_0003:  ldc.i4.0    
IL_0004:  ceq         
IL_0006:  stloc.0     
IL_0007:  br.s        IL_0009
IL_0009:  ldloc.0     
IL_000A:  ret     
于 2012-09-06T02:21:54.797 に答える
0

Where()拡張メソッドを使用するSelect(a => a)と、各エントリのインスタンスを返す場合、select部分は必要ありません。

クエリタイプの式では、式の最後にselect部分が常に必要select aです。これは冗長に見えますが、構文で必要です。

さらに、First()拡張メソッドには、対応するクエリタイプの構文がありません。したがって、クエリタイプ式に角かっこを追加する必要があります(a> 0でaを選択します)。First()ネストされたクエリの場合、クエリタイプ式にも角かっこを追加する必要があります。b.First(a > 0)代わりに直接使用できますb.Where(a > 0).First()

したがって、拡張メソッドの使用を推奨します。

于 2012-09-06T04:31:01.070 に答える