リストから1つのユニークな要素を取得するのに必要な時間を最小限に抑えたい。 Find
,Single
、First
の中で最も速い方法はどれですか? 検索キーは一意のIDです。Find、Single、Firstのうち、どちらが最速ですか?
答えて
最速(大きなセットの場合)は、Dictionary<TKey,TValue>
とキーイングして使用することです。
Single
とFirst
は異なることを行います。 Single
は、リストの最初に見つかったとしても、常にセット全体を繰り返します。したがって、First
は通常短絡するのでSingle
より早くなります。
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
は、で開始するいくつかの時間がかかります。
これらは異なる方法です。 Find
は、の拡張方法としてEnumerable.cs
に定義されているFirst
とほぼ同じです。条件付きアイテムが見つかった場合(両方ともコレクション全体をループする必要はない)、どちらもパフォーマンスの差があります。
Single
は条件付きアイテムを返しますが、このアイテムが条件を満たす唯一のアイテムであることも保証します。ほとんどの状況では、Single
は、コレクションをループする必要があるため、First
/Find
よりも遅いです。
既存の回答に加えて、List.FindはIEnumerable.Firstよりもはるかに高速です。最初のものはListの内部配列で操作できるためです。後者はIListインタフェースを経由しなければなりません。
- 1. どちらが速いですか?
- 2. どちらが速いですか
- 3. array_push()と$ array [] = ....どちらが最速ですか?
- 4. どちらが高速でしょうか
- 5. どちらが速いでしょうか?
- 6. Javaでの再帰、どちらが最善でしょうか?
- 7. mysql、ifnullとcoalesceはどちらが速いのですか?
- 8. loadHTML&loadHTMLFile、どちらが速いのですか?
- 9. Linq、lambda - どちらの文が高速ですか?
- 10. セマフォとミューテックスはどちらが速いのですか?
- 11. 処理が速いのはどちらですか?
- 12. unordered_map:find()またはcount()のどちらが高速ですか?
- 13. DrawDib StretchDIBitsはどちらが速いのですか?
- 14. どちらが高速ですか、C&MySqlかPHP&MySql?
- 15. ランダム突然変異ヒルクライマーと模擬アニーリング - どちらが最速ですか?
- 16. どちらが高速で、key_cacheまたはOSキャッシュですか?
- 17. getattr()とdictルックアップはどちらが速いですか?
- 18. accdbとmdb。どちらが速い/良いですか?
- 19. どちらが速いですか:連合または連合?
- 20. どちらが速く/より良いですか?
- 21. これらのうち、どちらが優れたPHP関数ですか?
- 22. データベースまたはメモリからのクエリですか?どちらが速いの?
- 23. 範囲ベースのforループですが、どちらが速いのですか?
- 24. 「FMAPのどちらかが」
- 25. iOS用のMVC、MVVM、MVPのどちらが最適ですか
- 26. ==対===リモートJavaScriptファイルで。どちらが速いの?
- 27. どちらの方が速く、int型の文字列かString型ですか?
- 28. どちらが速いか:相関サブクエリまたは結合?
- 29. どちらがmysql接続に最適ですか?
- 30. どちらが最適ですか?ドメインリダイレクトまたはエイリアス?
@usrは興味深い点があります。もし彼が正しいのであれば 'Find()'を使う方が速くないでしょうか? – Coops
@CodeBlend:多分。実際には、その違いが重要であるとは思っていません。彼らはどちらも「O(n)」となり、試合を見つけたときに終了します。私は一般的にLINQメソッドを使用して、その差が重要であることを証明できない限り、一般性を高めます。もちろん、辞書を使うことはもちろん、複数のルックアップの方が良いでしょう。 –