2

問題:List<string>文字列を 1 つずつ繰り返し追加して、 を作成します。List<string>最終結果は、重複のないものである必要があります。

1)文字列をリストに追加するときは、文字列が既に存在するかどうかを確認しmyList.Contains(myString)、そうでない場合は を使用しmyList.Add(myString)ます。最終結果には重複はありませんが、リストは毎回チェックされます。

2)毎回myList.Add(myString)リストをチェックせずに、何の注意もせずに、必要に応じSELECT DISTINCTて、リストから効果的にいくつかのテクニックを使用します。例https://stackoverflow.com/a/7572073/1061602 - 最終結果は単なるList<string>

Q:効率性と読みやすさの点で最適なアプローチはどれですか (1、2、またはその他?)。

過度に大きくはList<string>なりませんが、約 200 のチェックで約 10 個の文字列を含むことになります。これは、約 600 のチェックで約 30 の文字列までスケールアップできます。

4

2 に答える 2

5

最良のアプローチは、HashSet<string>代わりに a を使用することです。これにより、重複が透過的に「食い尽くされ」ます。セットを使用する場合、「重複チェック」操作は自動であるだけでなく、リストを使用する場合よりもはるかに高速です (一定時間対線形)。

文字列コンシューマーが消費できる場合IEnumerable<string>は、それだけで十分です。それ以外の場合はEnumerable.ToList、セットをリストに変換するために使用します。

于 2013-10-21T10:13:23.720 に答える
1

シナリオでは、封じ込めをチェックするために O(1) が得られるため、Hashset を使用する必要があります。リストがソートされていない限り、O(n)で実行されます。

于 2013-10-21T10:17:34.973 に答える