2009-09-16 63 views
17

我已经在网上查看了这个,但我要求这个以确保我没有错过任何东西。有没有一个内置函数将HashSets转换为C#中的列表?我需要避免元素的重复,但我需要返回一个List。C#哈希集转换为列表

回答

48

这是我会怎么做:

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

HashSet的是,根据定义,不包含重复。所以不需要Distinct

+0

与此相关的,如果我有一个有序列表和我做 orderedList.Distinct( ).ToList()你能告诉我它是否保留orderedList中的顺序吗?它符合我的目的,如果它确保它始终保留重复元素的第一次出现并摆脱后来的发生(我有相关性排序的列表...需要保留更相关的列表) – atlantis 2009-09-16 05:25:13

+0

@Ngu there在HashSet中使用Distinct()是没有意义的,因为无论如何都不会有重复。 – 2009-09-16 06:00:50

+0

是的,订单被保留。 – Graviton 2009-09-16 06:24:11

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