2011-01-27 16 views

答えて

28

最速(大きなセットの場合)は、Dictionary<TKey,TValue>とキーイングして使用することです。

SingleFirstは異なることを行います。 Singleは、リストの最初に見つかったとしても、常にセット全体を繰り返します。したがって、Firstは通常短絡するのでSingleより早くなります。

23

Firstは、一致が見つかるとすぐに終了できるので、Singleより速くなります。一方、これはではないことを意味します。は、1つの項目だけが述語と一致することを検証しません。

Findは、Firstと同じくらい速いはずですが、リストでのみ機能するため移植性が低くなります。一般的にLINQを使用している場合は、にLINQ演算子を使用してみてください。

マークさんの言うとおり、定期的にこれを行う場合は、Dictionary<,>を使用してください。あなたは簡単にこれを行うにはToDictionary演算子を使用することができます:あなたはが複数回検索ある場合にのみこれをしたいと思いますので、明らかに辞書を作成

var dictionary = list.ToDictionary(x => x.Id); 
// Now you can look up by ID really quickly 

は、で開始するいくつかの時間がかかります。

+0

@usrは興味深い点があります。もし彼が正しいのであれば 'Find()'を使う方が速くないでしょうか? – Coops

+1

@CodeBlend:多分。実際には、その違いが重要であるとは思っていません。彼らはどちらも「O(n)」となり、試合を見つけたときに終了します。私は一般的にLINQメソッドを使用して、その差が重要であることを証明できない限り、一般性を高めます。もちろん、辞書を使うことはもちろん、複数のルックアップの方が良いでしょう。 –

2

これらは異なる方法です。 Findは、の拡張方法としてEnumerable.csに定義されているFirstとほぼ同じです。条件付きアイテムが見つかった場合(両方ともコレクション全体をループする必要はない)、どちらもパフォーマンスの差があります。

Singleは条件付きアイテムを返しますが、このアイテムが条件を満たす唯一のアイテムであることも保証します。ほとんどの状況では、Singleは、コレクションをループする必要があるため、First/Findよりも遅いです。

1

既存の回答に加えて、List.FindはIEnumerable.Firstよりもはるかに高速です。最初のものはListの内部配列で操作できるためです。後者はIListインタフェースを経由しなければなりません。

関連する問題