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();