c# - 如何合并两个复杂类型的 HashSet 并保留第二组中的重复项?

标签 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 与第二个合并(结果在 main 中)并保留第二个中的重复项;我怎样才能做到这一点? (这是一个性能关键的代码)

我的代码:

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。

最佳答案

第二个策略可以像第一个策略一样通过先调用 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 方法相比,性能提升可以忽略不计。

关于c# - 如何合并两个复杂类型的 HashSet 并保留第二组中的重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51545404/

相关文章:

c# - LinqTo 实体中的日期部分相等

c# - 非通用声明不允许约束

c# - 多线程问题

Java - HashMap 和 HashSet 不受 Object.hashCode() 支持?

java - 从运行时列表中删除重复的字符串

c# - 从HashSet中获取原始值

C#,将变量转换为 Enum.GetUnderlyingType

c# - 如何在 C#/WPF 中以编程方式访问 Windows Media Player 库?

Java HashSet 包含预期值以外的值,而不是预定义值

c# - 为什么我不能预先分配一个 hashset<T>