如何在C#中将List<T>转换为HashSet<T>?

59

我有一个包含对象重复的列表,为了解决这个问题,我需要将列表转换成HashSet(在C#中)。有人知道如何做吗?


1
这是一个列表,不是一个数组。 - mathenthusiast8203
1
对于这种问题,它们都是 IList<YourType> - Richard
答案解决了问题——“HashSet有一个接受IEnumerable的构造函数”。 - David Sherret
3个回答

104

2
我推荐使用Distinct()函数,例如:somelist.Distinct(); - FlyingV

11

另外一种方式是

var yourlist = new List<SomeClass>();

// [...]

var uniqueObjs = yourlist.Distinct();  //Gives you a List with unique Objects of the List.

请注意,只有在SomeClass以某种方式重写GetHashCodeEquals时才有可能实现此目的。这也适用于

var uniqueObjs = new HashSet<SomeType>(yourOriginalList);
否则,您可以实现自己的 IEqualityComparer 类,并将其传递给 distinct 方法。
请注意,使用 Distinct() 方法,您还可以查找列表中对象的不同属性值。
var uniqueNames = yourlist.Select(obj => obj.Name).Distinct(); 

还有更多...


我更喜欢这个回答,而不是那些只回答具体问题的回答。"我想要一所有两扇门的房子,所以我打算将这座只有一扇门的房子推倒重建一座新房子"。 - Phylogenesis
1
你需要在 'SomeClass' 上实现 IEquatable 才能使其工作。 - yohannist
就我而言,如果您想基于原始列表创建新的Hashset,@YTAM也是如此。 - nozzleman
而它们被认为是重复的事实意味着它们在某种方式上必须是数学/逻辑上可等同的。 - Phylogenesis

9
如果你的类型实现了IEquatable<T>,并且Equals()GetHashCode()正确地实现了,那么你不需要自己进行去重。你可以像这样使用Linq的Distinct()来完成去重:
myList = myList.Distinct().ToList();

大多数情况下,我需要一个集合来从列表中去除重复项。这是实现此目的的一种很好的方式。 - Jabba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接