2009-09-16 2 views
17

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

ответ

48

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

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

HashSet, по определению, не содержащий дубликатов. Поэтому нет необходимости в Distinct.

+0

В связи с этим, если у меня есть упорядоченный список и я orderedList.Distinct () .ToList() не могли бы вы сказать мне, сохранит ли заказ в упорядоченном списке? Он служит моей цели, если он гарантирует, что он всегда сохраняет первое появление дублирующего элемента и избавляется от более позднего появления. (У меня есть список, упорядоченный по релевантности ... нужен более релевантный, который нужно сохранить) – atlantis

+0

@Ngu there не имеет смысла использовать Distinct() на HashSet, так как в любом случае дубликатов не будет –

+0

Да, заказ сохраняется. – Graviton

5

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

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

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

12

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

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); 
5
List<ListItemType> = new List<ListItemType>(hashSetCollection);