Преобразование HashSet в список

Я посмотрел это в сети, но я спрашиваю это, чтобы убедиться, что я ничего не пропустил. Есть ли встроенная функция для преобразования HashSets в списки на С#? Мне нужно избегать дублирования элементов, но мне нужно вернуть список.


person atlantis    schedule 16.09.2009    source источник


Ответы (3)


Вот как бы я это сделал:

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

HashSet по определению не содержит дубликатов. Так что нет необходимости в Distinct.

person Graviton    schedule 16.09.2009
comment
В связи с этим, если у меня есть упорядоченный список, и я делаю orderList.Distinct().ToList(), не могли бы вы сказать мне, сохраняет ли он порядок в упорядоченном списке? Это служит моей цели, если гарантирует, что он всегда сохраняет первое появление повторяющегося элемента и избавляется от более позднего появления. (У меня есть список, упорядоченный по релевантности... нужно сохранить более релевантный) - person atlantis; 16.09.2009
comment
@Ngu нет смысла использовать Distinct() в HashSet, так как в любом случае дубликатов не будет - person Simon Fox; 16.09.2009
comment
@Simon ... Именно то, что мне было интересно ... есть идеи, почему в HashSet есть метод Distinct () для начала? - person atlantis; 17.09.2009
comment
@atlantis - Различное идет с перечисляемым - person CramerTV; 24.10.2013

Два равноценных варианта:

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);

Лично я бы предпочел вызвать ToList, это означает, что вам не нужно повторно указывать тип списка.

Вопреки моим предыдущим мыслям, оба способа позволяют легко выразить ковариацию в C# 4:

    HashSet<Banana> bananas = new HashSet<Banana>();        
    List<Fruit> fruit1 = bananas.ToList<Fruit>();
    List<Fruit> fruit2 = new List<Fruit>(bananas);
person Jon Skeet    schedule 16.09.2009

Существует метод расширения Linq ToList<T>(), который сделает это (он определен в IEnumerable<T>, который реализован HashSet<T>).

Просто убедитесь, что вы using System.Linq;

Как вы, очевидно, знаете, HashSet гарантирует, что у вас нет дубликатов, и эта функция позволит вам вернуть его как IList<T>.

person Simon Fox    schedule 16.09.2009