C#中的HashSet是否有AddRange等效项?

Ste*_*gas 279 c# collections hashset addrange

使用列表,您可以:

list.AddRange(otherCollection);
Run Code Online (Sandbox Code Playgroud)

HashSet中没有添加范围方法.将另一个集合添加到HashSet的最佳方法是什么?

que*_*atl 484

因为HashSet<T>,名字是UnionWith.

这是为了表明工作的独特方式HashSet.你不能安全地将Add一组随机元素放入其中Collections,一些元素可能会自然消失.

我认为UnionWith它在"与另一个合并HashSet" 之后取名,然而,也有一个过载IEnumerable<T>.

  • Imho,`HashSet`(和`ISet`)是用数学设定的术语创建的.`UnionWith`是更接近的术语.除了`Except`之外,从数学角度来说,它应该被命名为"Subtract". (7认同)

And*_*rew 6

您还可以将CONCAT与 LINQ 结合使用。这会将一个集合或特别是一个附加HashSet<T>到另一个集合上。

\n
    var A = new HashSet<int>() { 1, 2, 3 };  // contents of HashSet \'A\'\n    var B = new HashSet<int>() { 4, 5 };     // contents of HashSet \'B\'\n\n    // Concat \'B\' to \'A\'\n    A = A.Concat(B).ToHashSet();    // Or one could use: ToList(), ToArray(), ...\n\n    // \'A\' now also includes contents of \'B\'\n    Console.WriteLine(A);\n    >>>> {1, 2, 3, 4, 5}\n
Run Code Online (Sandbox Code Playgroud)\n

注意: Concat()创建一个全新的集合。而且,UnionWith()比 Concat() 更快。

\n

...这个 ( Concat()) 还假设您实际上有权访问引用哈希集的变量并允许对其进行修改,但情况并非总是如此。 ” \xe2\x80\x93 @PeterDuniho

\n

  • 确实如此,您_可以_使用 `Concat()`。但这样做比仅仅调用专为此目的而设计的“UnionWith()”方法要糟糕 100%,正如已接受的答案所建议的那样。请注意,这还假设您实际上有权访问引用哈希集的变量并允许对其进行修改,但情况并非总是如此。 (3认同)
  • 再说一遍,您的示例_要求_实际上可以用新集合_替换_现有集合,这实际上并不总是正确的,并且在任何情况下都与解决方案**等效**的原始要求有很大的不同到`AddRange()`。这个问题特别要求_“将另一个`ICollection`添加到`HashSet`”_,但你提出的解决方案根本没有这样做;相反,它创建一个全新的“HashSet&lt;T&gt;”。 (2认同)

Roa*_*ich 5

这是一种方法:

public static class Extensions
{
    public static bool AddRange<T>(this HashSet<T> source, IEnumerable<T> items)
    {
        bool allAdded = true;
        foreach (T item in items)
        {
            allAdded &= source.Add(item);
        }
        return allAdded;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 还有什么选择呢?UnionWith 做了完全相同的事情。 (2认同)