Преобразование HashSet в Список - PullRequest
25 голосов
/ 16 сентября 2009

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

Ответы [ 4 ]

63 голосов
/ 16 сентября 2009

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

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

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

14 голосов
/ 16 сентября 2009

Два эквивалентных варианта:

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);
6 голосов
/ 16 сентября 2009

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

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

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

5 голосов
/ 09 марта 2014
List<ListItemType> = new List<ListItemType>(hashSetCollection);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...