具有封装的平等性

本文关键字:平等性 封装 | 更新日期: 2023-09-27 18:34:36

我有一个对象的集合,我想根据几个属性找到不同的值。

我可以这样做:

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

但我想概括平等语义。像这样:

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 函数获取不同的值?

具有封装的平等性

如果不能更改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());