2014-03-27 54 views
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 :(

回答

1

一個幸運的猜測後,它看起來像答案只是實現IEquatable<T>接口,像下面展示。通過使用不同的比較器實現,HashSet<T>(或至少單聲道實現)然後採用無分配方法來對其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)) { ... } 
+1

這在MS實施中也是如此。 'HashSet'使用'EqualityComparer .Default'(當沒有提供自定義比較器;這是您可以使用的另一個選項),如果可能,則使用'IEquatable ',如果不是,則使用'object'重載。 – Servy

相關問題