【问题标题】:How to convert List<T> to HashSet<T> in C#? [duplicate]如何在 C# 中将 List<T> 转换为 HashSet<T>? [复制]
【发布时间】:2015-09-12 05:07:48
【问题描述】:

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

【问题讨论】:

  • 这是一个列表,而不是数组。
  • 这类问题都是IList&lt;YourType&gt;
  • 答案解决了这个问题——“HashSet 有一个接受 IEnumerable 的构造函数”。

标签: c# list hashset


【解决方案1】:

确保您的对象的类覆盖EqualsGetHashCode,然后您可以将List&lt;T&gt; 传递给HashSet&lt;T&gt; constructor

var hashSet = new HashSet<YourType>(yourList);

你可能会看到:What is the best algorithm for an overridden System.Object.GetHashCode?

【讨论】:

  • 我推荐 Distinct() 函数;即:somelist.Distinct();
【解决方案2】:

另一种方法是

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

否则,您可以实现自己的 IEqualityComnparer-class 并将其传递给 distinct。

请注意,使用Distinct() 方法,您还可以在列表中查找对象的不同属性值:

var uniqueNames = yourlist.Select(obj => obj.Name).Distinct(); 

还有更多...

【讨论】:

  • 我更喜欢这个答案,而不是那些回答特定问题的答案。 “我想要一个有两扇门的房子,所以我要推平这栋只有一扇门的房子,然后从头开始建造一座新房子”
  • 您需要在“SomeClass”上实现 IEquatable 才能正常工作
  • @YTAM 就我而言,如果您想根据原始列表创建一个新的 Hashset,也是这种情况。
  • 它们被认为是重复的这一事实意味着它们必须在某种程度上在数学/逻辑上是等价的。
【解决方案3】:

如果您的类型正确实现了IEquatable&lt;T&gt;Equals()GetHashCode(),那么您不需要自己进行重复数据删除。您可以使用 Linq 的 Distinct() 这样做:

myList = myList.Distinct().ToList();

【讨论】:

  • 大多数时候我需要一个集合来从列表中删除重复项。这是实现这一目标的好方法。
猜你喜欢
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 2011-08-05
相关资源
最近更新 更多