如何合并两个复杂类型的HashSet并保留第二个集合的重复项?

时间:2018-07-26 18:29:11

标签: c# hashset

我的复杂类型为:

class Row : IEquatable<Row>
{
    public Type Type1 { get; }
    public Type Type2 { get; }

    public int dummy;

    public override int GetHashCode()
    {
        var type1HashCode = Type1.GetHashCode();

        //djb2 hash
        unchecked
        {
            return ((type1HashCode << 5) + type1HashCode) ^ Type2.GetHashCode();
        }
    }

    // Equals method also overrided
}

我有一个HashSet ,我想将它与具有两种不同策略的另一个HashSet合并;首先,我想合并并保留来自主HashSet的重复项,我尝试了main.UnionWith(second),现在我想将main与第二个HashSet合并(结果在main中),并保留与第二个HashSet的重复项;我怎样才能做到这一点? (这是对性能至关重要的代码)

我的代码:

var main = new HashSet<Row>()
{
    new Row(typeof(int), typeof(long))
    {
        dummy = 10
    }
};
var second = new HashSet<Row>()
{
    new Row(typeof(int), typeof(long))
    {
        dummy = 20
    }
};

// Merge here.

Trace.Write(main.First().dummy) //I want 20

我希望main.First().dummy为20。

2 个答案:

答案 0 :(得分:3)

可以通过先调用main.ExceptWith(second);然后再调用main.UnionWith(second)来实现第二种策略。

因为UnionWith基本上是

的快捷方式
foreach (var element in second)
    main.Add(element);

ExceptWith-的快捷方式

foreach (var element in second)
    main.Remove(element);

第二种策略也可以通过一个循环来实现:

foreach (var element in second)
{
    main.Remove(element);
    main.Add(element);
}

但是我认为与ExceptWith + UnionWith方法相比,性能提升可以忽略不计。

答案 1 :(得分:1)

如果我正确地阅读了此内容,则希望在合并后保留重复的值。在这种情况下,HashSet是您目标的错误数据结构。

来自HashSet(T)的MSDN文档:

  

HashSet集合未排序,并且不能包含重复的元素。如果顺序或元素重复对您的应用程序而言比性能更重要,请考虑将List类与Sort方法一起使用。