我发现的微软文档没有明确回答我的问题,因为它没有明确指出如何ToHashSet()处理重复项。
它们是否包含在内?、是否已删除?或者它会触发错误吗?
在我的搜索和测试中,似乎重复项被悄悄删除。StackOverflow 上的其他问题假设应该删除重复项。
只要 和.Equals()被.GetHashCode()正确覆盖,这似乎对于所有对象都是如此。
我是正确的还是我错过了什么? 假设会产生错误。
我只需要一个简单的“是”答案以及文档链接即可。
这个问题的两个触发因素是:
ToDictionary 的文档特别指出它会在重复时引发错误。的文档没有.ToHashSet()提及重复项。
在调用 之前查看执行 a.Distinct()或 的代码。这意味着开发人员要么不理解,要么害怕产生错误。.GroupBy().ToHashSet().ToHashSet()
根据定义,集合不能包含重复元素。
.NET 方法记录了它们可以引发哪些异常。ToHashSet()没有列出任何异常,因此我们可以放心地假设它不会抛出任何异常。
实际上有两种可能的实现ToHashSet():
HashSet构造函数。该文档的“备注”部分指出:如果
collection包含重复项,则该集合将包含每个唯一元素之一。不会抛出异常。因此,结果集的大小与集合的大小不同。
因此,简单地跳过相同的元素。如果您阅读源代码,这就是确实使用的实现。
Add最初为空的集合。Add不会抛出,因为它声明返回:
true如果元素被添加到HashSet<T>对象中;如果该元素已经存在,则返回 false。
无论如何,都不会抛出异常。重复项将被忽略,结果集仅包含唯一元素。