web-dev-qa-db-fra.com

Comment convertir List <T> en HashSet <T> en C #?

J'ai une liste contenant des doublons d'objets. Pour résoudre cela, je dois convertir la liste en un HashSet (en C #). Est-ce que quelqu'un sait comment?

30
mathenthusiast8203

Assurez-vous que la classe de votre objet remplace Equals et GetHashCode, puis vous pouvez passer le List<T> à HashSet<T>constructeur .

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

Vous pouvez voir: Quel est le meilleur algorithme pour un System.Object.GetHashCode substitué?

55
Habib

Une autre solution serait

var yourlist = new List<SomeClass>();

// [...]

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

Notez que cela n'est possible que si SomeClass remplace GetHashCode et Equals d'une manière ou d'une autre. Cela vaut également pour

var uniqueObjs = new HashSet<SomeType>(yourOriginalList);

Sinon, vous pourriez implémenter votre propre classe IEqualityComnparer- et la transmettre à distinct.

Notez qu'avec l'approche Distinct(), vous pouvez également rechercher des valeurs de propriété distinctes de l'objet dans la liste:

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

et encore plus ...

7
nozzleman

Si votre type implémente IEquatable<T>, Equals() et GetHashCode() correctement, vous n'avez pas besoin de faire la déduplication vous-même. Vous pouvez utiliser la Distinct() de Linq pour le faire comme ceci:

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