我有一个复杂类型:
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
}
我有一个 HashSetmain.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/