ToHashSet() 是否会在不引发错误的情况下自动删除重复项?

Does ToHashSet() automatically remove duplicates without raising an error?

我发现的 Microsoft documentation 没有明确回答我的问题,因为它没有明确说明 ToHashSet() 将如何处理重复项。

它们是否包含在内?已删除?还是会触发错误?

在我的搜索和测试中,重复项似乎被悄悄地删除了。 Whosebug 上的其他问题假定应删除重复项。

只要 .Equals().GetHashCode() 被正确覆盖,这似乎对所有对象都是正确的。

我是对的还是我漏掉了什么? 假设会产生错误。

我只需要 的简单回答和 link 文档。

这个问题的两个触发因素是:

  1. documentation for ToDictionary 明确表示它会在重复项上引发错误。 .ToHashSet() 的文档说没有 关于重复项。

  2. 看到在调用 .ToHashSet() 之前执行 .Distinct().GroupBy() 的代码。这意味着开发人员要么不理解 .ToHashSet(),要么他们害怕制造错误。

根据定义,集合不能包含重复元素。

.NET 方法记录了它们可以引发的异常。 ToHashSet() 没有列出任何异常,所以我们可以放心地假设它不会抛出任何异常。

ToHashSet()确实有两种可能的实现:

  1. 它将工作委托给this HashSet constructor。文档的“备注”部分指出:

If collection contains duplicates, the set will contain one of each unique element. No exception will be thrown. Therefore, the size of the resulting set is not identical to the size of collection.

因此,相同的元素将被简单地跳过。这个是看了源码确实用到的实现

  1. 它枚举源序列并在最初为空的集合上重复调用 AddAdd 不会抛出,因为它表示 return:

true if the element is added to the HashSet<T> object; false if the element is already present.

无论如何,都不会抛出异常。忽略重复项,结果集仅包含唯一元素。