web-dev-qa-db-ja.com

リストから一意のアイテムを取得する

リストからすべての個別のアイテムを取得する最も高速で効率的な方法は何ですか?

List<string>があり、その中に複数の繰り返しアイテムが含まれている可能性があり、リスト内の一意の値のみが必要です。

87
domgreen

HashSet<T> を使用します。例えば:

var items = "A B A D A C".Split(' ');
var unique_items = new HashSet<string>(items);
foreach (string s in unique_items)
    Console.WriteLine(s);

プリント

 A 
 B 
 D 
 C 
137
Vinay Sajip

Distinct メソッドを使用して、個別のアイテムのIEnumerable<T>を返すことができます。

var uniqueItems = yourList.Distinct();

List<T>として返される一意のアイテムのシーケンスが必要な場合は、 ToList への呼び出しを追加できます。

var uniqueItemsList = yourList.Distinct().ToList();
130
LukeH

LINQの Distinct 拡張メソッドを使用できます

6
aku

.Net 2.0では、このソリューションについてかなり確信しています。

public IEnumerable<T> Distinct<T>(IEnumerable<T> source)
{
     List<T> uniques = new List<T>();
     foreach (T item in source)
     {
         if (!uniques.Contains(item)) uniques.Add(item);
     }
     return uniques;
}
6
Murilo Beltrame

LINQのDistinct拡張メソッドとは別に、コレクションで初期化する HashSet<T> オブジェクトを使用できます。これは、おそらくGetHashCode)ではなくハッシュコード(IEqualityComparer)を使用するため、LINQの方法よりも効率的です。

実際、あなたの状況に適している場合は、最初にアイテムを保存するためにHashSetを使用します。

4
Noldorin