代码之家  ›  专栏  ›  技术社区  ›  AnthonyVO

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

c#
  •  -3
  • AnthonyVO  · 技术社区  · 4 年前

    这个 Microsoft documentation 我发现没有清楚地回答我的问题,因为它没有清楚地表明什么 ToHashSet() 将处理重复项。

    它们包括在内吗?,删除?还是会引发错误?

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

    只要 .Equals() .GetHashCode() 被正确地覆盖。

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

    一个简单的答案 我只需要一个指向文档的链接。

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

    1. 这个 documentation for ToDictionary 特别指示它将在重复项上引发错误。的文档 .ToHashSet() 没有什么 关于重复。

    2. 查看执行 .Distinct() .GroupBy() 打电话之前 .ToHashSet() 。这意味着开发人员要么不理解 .ToHashSet() 或者他们害怕制造一个bug。

    0 回复  |  直到 4 年前
        1
  •  6
  •   Etienne de Martel    4 年前

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

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

    对于 ToHashSet() :

    1. 它将工作委派给 this HashSet constructor 文件的“备注”部分规定:

    如果 collection 包含重复项,则集合将包含每个唯一元素中的一个。不会引发任何异常。因此,结果集的大小与集合的大小不相同。

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

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

    true 如果元素被添加到 HashSet<T> 对象如果元素已经存在,则为false。

    在任何情况下,都不会抛出任何异常。重复项将被忽略,并且生成的集合仅包含唯一的元素。