C#列表<;对象>;。Equals在对象比较时失败
我有如下的课程。对于这个类的对象,我需要添加一种新的语言,以防它不存在C#列表<;对象>;。Equals在对象比较时失败,c#,.net,list,object,equals-operator,C#,.net,List,Object,Equals Operator,我有如下的课程。对于这个类的对象,我需要添加一种新的语言,以防它不存在 using System; using System.Collections.Generic; namespace discovery.POCO { public class MultiLingualObject { public string TableName { get; set; } public string BranchId { get; set; }
using System;
using System.Collections.Generic;
namespace discovery.POCO
{
public class MultiLingualObject
{
public string TableName { get; set; }
public string BranchId { get; set; }
public int GenericId { get; set; }
public string GenericCode { get; set; }
public List<MultiLingualColumn> MultiLingColumnsCollection = new List<MultiLingualColumn>();
}
public class MultiLingualColumn : IEquatable<MultiLingualColumn>
{
public string ColumnName { get; set; }
public string LanguageCode { get; set; }
public string LanguageText { get; set; }
public bool Equals(MultiLingualColumn other)
{
if (other == null) return false;
return string.Equals(ColumnName,other.ColumnName) &&
string.Equals(LanguageCode, other.LanguageCode) &&
string.Equals(LanguageText, other.LanguageText);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != GetType()) return false;
return Equals(obj as MultiLingualColumn);
}
}
}
但它忽略了这个条件,再次添加了相同的语言。可以从所附的图片中看到
有人能告诉我该修什么吗?您正在将列表与单个对象进行比较。您需要
.Contains()
而不是.Equals()
正确实施IEquatable
,或。发件人:
在自定义类上实现IEquatable,或者重写Equals(和GetHashCode)
此代码打印“True”:
公共类Foo:IEquatable
{
公共字符串条{get;set;}
公共布尔等于(Foo其他)
{
返回other.Bar==此.Bar;
}
}
公共静态void Main()
{
变量列表=新列表
{
新Foo{Bar=“Baz”}
};
WriteLine(list.Contains(newfoo{Bar=“Baz”}));
}
但是,正如@Jeppe正确注释的那样,建议还为其他收集和比较类型提供适当的
GetHashCode()
实现。您将列表与单个对象进行比较。您需要.Contains()
而不是.Equals()
正确实施IEquatable
,或。发件人:
在自定义类上实现IEquatable,或者重写Equals(和GetHashCode)
此代码打印“True”:
公共类Foo:IEquatable
{
公共字符串条{get;set;}
公共布尔等于(Foo其他)
{
返回other.Bar==此.Bar;
}
}
公共静态void Main()
{
变量列表=新列表
{
新Foo{Bar=“Baz”}
};
WriteLine(list.Contains(newfoo{Bar=“Baz”}));
}
但是,正如@Jeppe正确注释的那样,建议还为其他收集和比较类型提供适当的
GetHashCode()
实现。您应该使用Contains()
方法。您还应该为多语言列实现IEquatable
接口,或者实现IEqualityComparer
并将第二个参数传递给Contains()
。我更喜欢第二种选择:
public class MultiLingualColumnComparer : IEqualityComparer<MultiLingualColumn>
{
public bool Equals(MultiLingualColumn x, MultiLingualColumn y)
{
//...
}
public int GetHashCode(MultiLingualColumn obj)
{
//...
}
}
您应该使用Contains()
方法。您还应该为多语言列实现IEquatable
接口,或者实现IEqualityComparer
并将第二个参数传递给Contains()
。我更喜欢第二种选择:
public class MultiLingualColumnComparer : IEqualityComparer<MultiLingualColumn>
{
public bool Equals(MultiLingualColumn x, MultiLingualColumn y)
{
//...
}
public int GetHashCode(MultiLingualColumn obj)
{
//...
}
}
别忘了接受一个能解决你问题的答案。别忘了接受一个能解决你问题的答案。仅供参考-关于您关于GetHashCode()
的评论,您的链接明确表示他需要IEquatable
或GetHashCode()
,OP使用了IEquatable
,所以他不需要它。。。如果实现IEquatable
和/或覆盖Equals(object)
,那么不覆盖GetHashCode
是一个非常糟糕的主意。对于List.Contains
而不使用它的情况下,它可以很好地工作。但是,只要您使用字典
或哈希集
,或执行Linq的.Distinct()
等操作,它就会失败。至少,包括public override int GetHashCode()=>抛出新的NotSupportedException()
以防止射中自己的脚。@JeppeStigNielsen这可能是新手的问题,但是重写GetHashCode会对性能产生任何影响吗?@KDWolf是的,如果您重写GetHashCode()
,并且您使用过任何可以利用GetHashCode()
的功能,就像我在第一篇评论中提到的,那么精确的实现可能会影响性能。但第一要务应该是正确的行为。如果不重写,将得到错误的行为。例如,如果使用list.Distinct().Count()
,并且列表中有两个或多个“相等”但“不相同”的实例,那么如果不重写GetHashCode()
@RandRandom Yes,几乎肯定会得到错误的计数。当然,使用显式的IEqualityComparer
只会将“问题”移到该类。如果您不想尝试编写一个好的GetHashCode()
或GetHashCode(obj)
实现,您可以选择:(a)抛出NotSupportedException
,这意味着一旦出现GetHashCode
需求,就会通知您。或者,(B)只返回一个常量,如-1
,它将给出正确的行为,但性能较差。两者都可以。只是永远不要使用System.Object
中未重写的GetHashCode
,因为您以后会遇到“不可理解”的问题。仅供参考-关于您对GetHashCode()
的评论,您的链接明确表示他需要IEquatable
或GetHashCode())
而OP使用了IEquatable
,所以他不需要它。。。如果实现IEquatable
和/或覆盖Equals(object)
,那么不覆盖GetHashCode
是一个非常糟糕的主意。对于List.Contains
而不使用它的情况下,它可以很好地工作。但是,只要您使用字典
或哈希集
,或执行Linq的.Distinct()
等操作,它就会失败。至少,包括public override int GetHashCode()=>抛出新的NotSupportedException()
以防止射中自己的脚。@JeppeStigNielsen这可能是新手的问题,但是重写GetHashCode会对性能产生任何影响吗?@KDWolf是的,如果您重写GetHashCode()
,并且您使用过任何可以利用GetHashCode()
的功能,就像我在第一篇评论中提到的,那么精确的实现可能会影响性能。但是第一个pri
public class MultiLingualColumnComparer : IEqualityComparer<MultiLingualColumn>
{
public bool Equals(MultiLingualColumn x, MultiLingualColumn y)
{
//...
}
public int GetHashCode(MultiLingualColumn obj)
{
//...
}
}
if (!SupplierMultiLing.MultiLingColumnsCollection.Contains(_equals, new MultiLingualColumnComparer()))