2014-12-18 54 views
0

我有一個對象的集合,我想根據幾個屬性找到不同的值。與封裝的相等不同

我可以這樣做:

var distinct = myValues.GroupBy(p => new { A = p.P1, B = p.P2 }); 

但我想封裝平等sementics。這樣的事情:

public interface IKey<T> 
{ 
    bool KeyEquals(T other); 
} 
public class MyClass : IKey<MyClass> 
{ 
    public string P1 { get; set; } 
    public string P2 { get; set; } 
    public bool KeyEquals(MyClass other) 
    { 
     if(object.ReferenceEquals(this, other) 
      return true; 

     if(other == null) 
      return false; 

     return this.P1 == other.P1 && this.P2 == other.P2; 
    } 
} 

是否有O(N)的方式來獲取不同的值使用我的KeyEquals函數?

+0

你爲什麼不只是重載Equals和GetHashCode方法呢? –

+0

MyClass是可變的,我打算在哈希集合中使用它 – ConditionRacer

+0

您仍然可以實現IEqualityComparer並將它傳遞給GroupBY –

回答

1

如果你不能改變MyClass,你可以實現一個IEqualityComparer

class MyClassComparer : IEqualityComparer<MyClass> 
{ 
    public bool Equals(MyClass m1, MyClass m2) 
    { 
     return m1.KeyEquals(m2); 
    } 

    public int GetHashCode(MyClass m) 
    { 
     return (m.P1.GetHashCode() *23) + (m.P2.GetHashCode() * 17); 
    } 
} 

,並傳遞給GroupBy

var distinct = myValues.GroupBy(p => p, new MyClassComparer());