我的复杂类型为:
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 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。
答案 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方法一起使用。