web-dev-qa-db-ja.com

C#でList <T>をHashSet <T>に変換する方法は?

オブジェクトの複製を含むリストがあります。それを解決するには、リストを(C#で)HashSetに変換する必要があります。誰もが方法を知っていますか?

30

オブジェクトのクラスがEqualsGetHashCodeをオーバーライドしていることを確認してから、List<T>からHashSet<T>コンストラクター

var hashSet = new HashSet<YourType>(yourList);

オーバーライドされたSystem.Object.GetHashCodeに最適なアルゴリズムは何ですか?

55
Habib

別の方法は

_var yourlist = new List<SomeClass>();

// [...]

var uniqueObjs = yourlist.Distinct();  //Gives you a List with unique Objects of the List.
_

これは、SomeClassGetHashCodeおよびEqualsを何らかの方法でオーバーライドする場合にのみ可能であることに注意してください。これは

_var uniqueObjs = new HashSet<SomeType>(yourOriginalList);
_

それ以外の場合は、独自のIEqualityComnparer- classを実装し、distinctに渡すことができます。

Distinct()アプローチを使用すると、リスト内のオブジェクトの個別のプロパティ値を検索することもできます。

_var uniqueNames = yourlist.Select(obj => obj.Name).Distinct(); 
_

その他いくつか...

7
nozzleman

タイプが_IEquatable<T>_、Equals()およびGetHashCode()を正しく実装している場合、重複排除を自分で行う必要はありません。 LinqのDistinct()を使用して、次のようにすることができます。

_myList = myList.Distinct().ToList();
_
4
Matthew Watson