1

値のリストがたくさんあり(100〜200文字の文字列)、それらの個別のリストを返す必要があります。.NETを使用してこれを行う最も効率的な方法は何ですか?私が考えることができる2つの方法は次のとおりです。

  1. IEnumerableクラスのDistinct()メソッドを使用します
  2. 辞書を使う

辞書のアプローチが生の用語でより速い場合は、コードの保守性に関するトレードオフの決定を検討してください。

4

3 に答える 3

7

Enumerable.Distinct辞書を 1 回だけ使用する場合は、辞書を使用するのと同じくらいの速さであると予想されます。値を追加/削除し、明確さを維持できるようにしたい場合は、を構築できますHashSet<string>(これは基本的に Distinct がボンネットの下で行っていると私が期待していることですが、Distinct()新しい値を見つけると、順序を維持しながら明らかに返します.

実際、次を使用するだけです:

HashSet<string> distinctItems = new HashSet<string>(list);

順序がめちゃくちゃになることを気にしないのであれば、かなり良い(そして簡単な)解決策になります。を使用するよりも簡単でDictionary、概念的にもクリーンです (キーを値にマップしたくないため)

(これまでと同様に、最初に最も読みやすいソリューションを見つけてベンチマークすることをお勧めします。それが「十分に高速」である場合は、それを使用します。これを別のクエリの一部として使用する場合はDistinct、最も読みやすい方法である可能性があります。それ以外の場合は、お勧めしHashSetます。)

于 2009-11-13T08:36:59.607 に答える
2

個人的には、LINQ が提供する Distinct() メソッドを使用します。読みやすく、維持するのがはるかに簡単です。LINQ を使用するとディクショナリを使用するよりも遅くなりますが、違いは小さく (リストした場合)、データベース クエリや Web サービス呼び出しの最適化に時間を費やす方がよいでしょう。

于 2009-11-13T08:33:35.783 に答える
1

ここでプロファイリングを使用することをお勧めします。サンプル項目のリストを生成し、両方の方法で 1M 回ソートし、それぞれの方法で使用された時間を測定します。

可読性が問題になる場合は、GetDistinctItemsメソッドを作成し、その中にコードを配置します。ほら、自己文書化されたコードです。

于 2009-11-13T08:31:45.187 に答える