C# IEqualityComparer<;T>;不适用于列表<;T>;。Distinct()方法

C# IEqualityComparer<;T>;不适用于列表<;T>;。Distinct()方法,c#,.net,linq,iequalitycomparer,C#,.net,Linq,Iequalitycomparer,我有以下简单的对象: public class Net : IEqualityComparer<Net> { public string Name { get; private set; } public int Id { get; set; } private Gate _inGate; private Gate _outGate; private NetValue _value = NetValue.NotSet; private

我有以下简单的对象:

public class Net : IEqualityComparer<Net>
{
    public string Name { get; private set; }
    public int Id { get; set; }

    private Gate _inGate;
    private Gate _outGate;
    private NetValue _value = NetValue.NotSet;
    private bool _isMiddleNet;

    //constructor and stuff!!!.....

    //Equality comparer
    public bool Equals(Net x, Net y)
    {
        return (x.Id == y.Id && x.Name == y.Name);
    }

    public int GetHashCode(Net obj)
    {
        return obj.Id.GetHashCode() ^ obj.Name.GetHashCode();
    }

    public override int GetHashCode()
    {
        return 13 * Id.GetHashCode() + 7 * Name.GetHashCode();
    }

但这根本不起作用!我做错了什么?

您需要制作对象。是一个对象接口,用于将两个对象相互比较。
IEquatable
用于将一个对象与相同类型的另一个对象进行比较

否则,如果您想使用
IEqualityComparer
,它将被传递到
Distinct()
方法

// better to extend off of EqualityComparer<T> instead of
//     implementing IEqualityComparer<T> directly
public class NetComparer : EqualityComparer<Net>
{
    public override bool Equals(Net x, Net y)
    {
        return (x.Id == y.Id && x.Name == y.Name);
    }

    public override int GetHashCode(Net obj)
    {
        return obj.Id.GetHashCode() ^ obj.Name.GetHashCode();
    }
}

inputNetsA = inputNetsA.Distinct(new NetComparer()).ToList();
//最好扩展EqualityComparer,而不是
//直接实现IEqualityComparer
公共类网络比较器:EqualityComparer
{
公共覆盖布尔等于(净x,净y)
{
返回(x.Id==y.Id&&x.Name==y.Name);
}
公共覆盖int GetHashCode(Net obj)
{
返回obj.Id.GetHashCode()^obj.Name.GetHashCode();
}
}
inputNetsA=inputNetsA.Distinct(新的NetComparer()).ToList();

非常感谢。我在这一行
上得到null引用,返回obj.Id.GetHashCode()^obj.Name.GetHashCode()
如果我只在GetHashCode中返回null可以吗?
GetHashCode()
的返回类型是
int
,不能返回
null
。我能说的就是,返回适合该类型的任何内容。如果用于生成哈希代码的对象的一个成员可以是
null
,那么它可能不是合适的键?否则,您需要决定如何处理它们。e、 例如,将其视为
0
扩展
EqualityComparer
而不是直接实现
EqualityComparer
有什么好处?我从未听说过它,最终接口有两个方法,
EqualityComparer
有两个抽象方法(它们是相同的)…@JeffMercado忽略它。。。看到你的其他回应了吗。该类通过调用泛型(可重载)版本来实现非泛型版本?
object.Equals
implementation在哪里?有关信息,请参阅和链接的问题。。。
// better to extend off of EqualityComparer<T> instead of
//     implementing IEqualityComparer<T> directly
public class NetComparer : EqualityComparer<Net>
{
    public override bool Equals(Net x, Net y)
    {
        return (x.Id == y.Id && x.Name == y.Name);
    }

    public override int GetHashCode(Net obj)
    {
        return obj.Id.GetHashCode() ^ obj.Name.GetHashCode();
    }
}

inputNetsA = inputNetsA.Distinct(new NetComparer()).ToList();