0
我使用的HashSet
集合類型已經顯着提高了算法的性能。似乎每次我調用myHashSet.Contains(someValue)
時,內部實現在調用Equals
之前立即裝入值類型。具有自定義結構的HashSet通過Contains函數分配重量
使用值類型時,有沒有辦法避免這些浪費的分配?
示例代碼:
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 :(
這在MS實施中也是如此。 'HashSet'使用'EqualityComparer.Default'(當沒有提供自定義比較器;這是您可以使用的另一個選項),如果可能,則使用'IEquatable ',如果不是,則使用'object'重載。 –
Servy