Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#列表<;对象>;。Equals在对象比较时失败_C#_.net_List_Object_Equals Operator - Fatal编程技术网

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