2009-09-16 15 views
17

Sprawdziłem to w sieci, ale proszę o to, aby upewnić się, że nie przegapiłem czegoś. Czy istnieje wbudowana funkcja do konwersji HashSets do list w C#? Muszę unikać obłudy elementów, ale muszę zwrócić listę.C# Hashset konwersja na listy

Odpowiedz

48

Oto jak zrobiłbym to:

using System.Linq; 
    HashSet<int> hset = new HashSet<int>(); 
    hset.Add(10); 
    List<int> hList= hset.ToList(); 

HashSet jest, z definicji, nie zawierające duplikaty. Więc nie ma potrzeby, aby Distinct.

+0

Wiąże się z tym, jeśli mam uporządkowaną listę i zrobić orderedList.Distinct () .ToList() czy możesz mi powiedzieć, czy zachowuje kolejność w liście uporządkowanej? Służy temu celowi, jeśli gwarantuje, że zawsze zachowuje pierwsze wystąpienie duplikatu i pozbywa się późniejszego wystąpienia (mam listę uporządkowaną według trafności ... potrzebuję zachować bardziej odpowiednią) – atlantis

+0

@Ngu tam nie ma sensu używać Distinct() na HashSet, ponieważ i tak nie będzie duplikatów. –

+0

Tak, zamówienie zostało zachowane. – Graviton

5

Istnieje metoda rozszerzenia Linq ToList<T>(), która to zrobi (jest zdefiniowana na IEnumerable<T>, która jest implementowana przez HashSet<T>).

Wystarczy upewnić się, jesteś using System.Linq;

Jak są oczywiście świadomi HashSet zapewni nie masz duplikatów, a funkcja ta pozwoli Ci powrócić go jako IList<T>.

12

Dwa równorzędne opcje:

HashSet<string> stringSet = new HashSet<string> { "a", "b", "c" }; 
// LINQ's ToList extension method 
List<string> stringList1 = stringSet.ToList(); 
// Or just a constructor 
List<string> stringList2 = new List<string>(stringSet); 

Osobiście wolałbym zawijające ToList to oznacza to, że nie trzeba przekształcać typ listy.

przeciwieństwie do moich poprzednich myśli, oba sposoby pozwalają kowariancji być łatwo wyrażona w C# 4:

HashSet<Banana> bananas = new HashSet<Banana>();   
    List<Fruit> fruit1 = bananas.ToList<Fruit>(); 
    List<Fruit> fruit2 = new List<Fruit>(bananas); 
5
List<ListItemType> = new List<ListItemType>(hashSetCollection);