web-dev-qa-db-ja.com

一意の文字列の効率的なリストC#

重複を無視して文字列のリストを保存する最も効率的な方法は何ですか?辞書はdict [str] = false;と書くことで文字列を挿入するのに最適かもしれないと思っていました。キーをリストとして列挙します。それは良い解決策ですか?

83
user34537

.NET 3.5を使用している場合、 HashSet が機能します。

HashSet <(Of <(T>)>)クラスは、高性能のセット操作を提供します。セットは、重複する要素を含まないコレクションであり、要素の順序は特にありません。

105
JP Alioto

あなたはこのようなことをするように見えることができます

var hash = new HashSet<string>();
var collectionWithDup = new []{"one","one","two","one","two","zero"}; 

// No need to check for duplicates as the Add method
// will only add it if it doesn't exist already
foreach (var str in collectionWithDup)
    hash.Add(str);   
21
Perpetualcoder

これが良い答えとしてカウントされるかどうかはわかりませんが、挿入順序を維持するユニークなセットの必要性に直面したとき、HashSetとListを並べて妥協しました。この場合、セットに追加するたびに、次を実行します。

if(hashSet.Add(item))
    orderList.Add(item);

アイテムを削除するときは、必ず両方から削除してください。したがって、リストにアイテムが追加されていないことを確認できる限り、挿入順の一意のセットが作成されます。

14
scone

次のようにLinqを使用することもできます。

using System.Linq;

var items = new List<string>() { "one", "one", "two", "one", "two", "zero" };

List<string> distinctItems = items.Distinct().ToList();
8

HashSetを使用します。Contains()を確認する必要はありません。リストにアイテムを追加するだけで、重複している場合は追加されません。

   HashSet<int> uniqueList = new HashSet<int>();
   uniqueList.Add(1); // List has values 1
   uniqueList.Add(2);  // List has values 1,2
   uniqueList.Add(1);  // List has values 1,2
   Console.WriteLine(uniqueList.Count); // it will return 2
8
Priyang

これはシステム名前空間の一部ではありませんが、NHibernateで http://www.codeproject.com/KB/recipes/sets.aspx のIesi.Collectionsを使用しています。ハッシュセットとソートセット、辞書セットなどをサポートしています。 NHibernateで使用されて以来、広く安定して使用されています。これも.Net 3.5を必要としません

2
AndrewB

HashSetを使用しない別のソリューションを次に示します。

var items = new List<string>() { "one", "one", "two", "one", "two", "zero" };
var uniqueItems = items.Where((item, index) => items.IndexOf(item) == index);

このスレッドから採用されました: javascript-配列内の一意の値

テスト:

using FluentAssertions;

uniqueItems.Count().Should().Be(3);
uniqueItems.Should().BeEquivalentTo("one", "two", "zero");

ListHashSet、およびSortedSetのパフォーマンステスト。 100万回の繰り返し:

List: 564 ms
HashSet: 487 ms
SortedSet: 1932 ms

テストソースコード(要点)

2
Alexey Solonets