我正在使用HashSet
集合类型,它已经显着提高了算法的性能。似乎每次调用myHashSet.Contains(someValue)
时,内部实现都会在调用Equals
之前立即装箱值类型。
使用值类型时,有没有办法避免这些浪费的分配?
示例代码:
public struct TestStruct {
public int a;
public int b;
public override int GetHashCode() {
return a ^ b;
}
public override bool Equals(object obj) {
if (!(obj is TestStruct))
return false;
TestStruct other = (TestStruct)obj;
return a == other.a && b == other.b;
}
}
var hashset = new HashSet<TestStruct>();
PopulateSet(hashset);
// About to go crazy on the allocations...
if (hashset.Contains(someValue)) { ... }
// Lots of allocations just happened :(
答案 0 :(得分:1)
幸运的猜测之后看起来答案就是实现IEquatable<T>
界面,如下所示。 HashSet<T>
(或至少Mono实现)然后通过使用不同的比较器实现对其Contains
方法采用无分配方法。
public struct TestStruct : IEquatable<TestStruct> {
...
public bool Equals(TestStruct other) {
return a == other.a && b == other.b;
}
}
// No more pain!
if (hashset.Contains(someValue)) { ... }