値のリストがたくさんあり(100〜200文字の文字列)、それらの個別のリストを返す必要があります。.NETを使用してこれを行う最も効率的な方法は何ですか?私が考えることができる2つの方法は次のとおりです。
- IEnumerableクラスのDistinct()メソッドを使用します
- 辞書を使う
辞書のアプローチが生の用語でより速い場合は、コードの保守性に関するトレードオフの決定を検討してください。
値のリストがたくさんあり(100〜200文字の文字列)、それらの個別のリストを返す必要があります。.NETを使用してこれを行う最も効率的な方法は何ですか?私が考えることができる2つの方法は次のとおりです。
辞書のアプローチが生の用語でより速い場合は、コードの保守性に関するトレードオフの決定を検討してください。
Enumerable.Distinct
辞書を 1 回だけ使用する場合は、辞書を使用するのと同じくらいの速さであると予想されます。値を追加/削除し、明確さを維持できるようにしたい場合は、を構築できますHashSet<string>
(これは基本的に Distinct がボンネットの下で行っていると私が期待していることですが、Distinct()
新しい値を見つけると、順序を維持しながら明らかに返します.
実際、次を使用するだけです:
HashSet<string> distinctItems = new HashSet<string>(list);
順序がめちゃくちゃになることを気にしないのであれば、かなり良い(そして簡単な)解決策になります。を使用するよりも簡単でDictionary
、概念的にもクリーンです (キーを値にマップしたくないため) 。
(これまでと同様に、最初に最も読みやすいソリューションを見つけてベンチマークすることをお勧めします。それが「十分に高速」である場合は、それを使用します。これを別のクエリの一部として使用する場合はDistinct
、最も読みやすい方法である可能性があります。それ以外の場合は、お勧めしHashSet
ます。)
個人的には、LINQ が提供する Distinct() メソッドを使用します。読みやすく、維持するのがはるかに簡単です。LINQ を使用するとディクショナリを使用するよりも遅くなりますが、違いは小さく (リストした場合)、データベース クエリや Web サービス呼び出しの最適化に時間を費やす方がよいでしょう。
ここでプロファイリングを使用することをお勧めします。サンプル項目のリストを生成し、両方の方法で 1M 回ソートし、それぞれの方法で使用された時間を測定します。
可読性が問題になる場合は、GetDistinctItems
メソッドを作成し、その中にコードを配置します。ほら、自己文書化されたコードです。