重複を無視して文字列のリストを保存する最も効率的な方法は何ですか?dict [str] = false;と書くことで、辞書に文字列を挿入するのが最善だと思っていました。キーをリストとして列挙します。それは良い解決策ですか?
重複を無視して文字列のリストを保存する最も効率的な方法は何ですか?dict [str] = false;と書くことで、辞書に文字列を挿入するのが最善だと思っていました。キーをリストとして列挙します。それは良い解決策ですか?
回答:
.NET 3.5を使用している場合は、HashSetが機能するはずです。
HashSet <(Of <(T>)>)クラスは、高性能のセット操作を提供します。セットは、重複する要素を含まず、要素の順序が特定されていないコレクションです。
あなたはこのようなことをするように見えることができます
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);
次のようにLinqを使用することもできます。
using System.Linq;
var items = new List<string>() { "one", "one", "two", "one", "two", "zero" };
List<string> distinctItems = items.Distinct().ToList();
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
これはシステム名前空間の一部ではありませんが、NHibernateでhttp://www.codeproject.com/KB/recipes/sets.aspxのIesi.Collectionsを使用しています。ソートされたセット、辞書セットなどとともに、ハッシュされたセットをサポートしています。NHibernateで使用されて以来、広く使用されており、非常に安定しています。これも.Net3.5を必要としません
を使用しない別の解決策を次に示し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");
List
、HashSet
およびのパフォーマンステストSortedSet
。100万回の反復:
List: 564 ms
HashSet: 487 ms
SortedSet: 1932 ms
HashSet
アイテムの順序は失われます。がList
提供する機能。