ToHashSet() 是否会自动删除重复项而不引发错误?

Ant*_*yVO 3 c# linq hashset

我发现的微软文档没有明确回答我的问题,因为它没有明确指出如何ToHashSet()处理重复项。

它们是否包含在内?、是否已删除?或者它会触发错误吗?

在我的搜索和测试中,似乎重复项被悄悄删除。StackOverflow 上的其他问题假设应该删除重复项。

只要 和.Equals().GetHashCode()正确覆盖,这似乎对于所有对象都是如此。

我是正确的还是我错过了什么? 假设会产生错误。

我只需要一个简单的“是”答案以及文档链接即可。

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

  1. ToDictionary 的文档特别指出它会在重复时引发错误。的文档没有.ToHashSet()提及重复项。

  2. 在调用 之前查看执行 a.Distinct()或 的代码。这意味着开发人员要么不理解,要么害怕产生错误。.GroupBy().ToHashSet().ToHashSet()

Eti*_*tel 7

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

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

实际上有两种可能的实现ToHashSet()

  1. 它将工作委托给这个HashSet构造函数。该文档的“备注”部分指出:

如果collection包含重复项,则该集合将包含每个唯一元素之一。不会抛出异常。因此,结果集的大小与集合的大小不同。

因此,简单地跳过相同的元素。如果您阅读源代码,这就是确实使用的实现。

  1. 它枚举源序列并重复调用Add最初为空的集合。Add不会抛出,因为它声明返回:

true如果元素被添加到HashSet<T>对象中;如果该元素已经存在,则返回 false。

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