[c#]不同与封装平等

标签: Linq C#
发布时间: 2017/2/28 21:05:53
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有想找基于几个属性的不同值的对象的集合。

我可以这样做︰

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 函数吗?

解决方法 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());
官方微信
官方QQ群
31647020