繁体   English   中英

C#清单 <Object> .equals在对象比较上失败

[英]C# List<Object>.Equals fails on object comparison

我有一个如下的课程。 我需要向此类的对象添加一种新语言,以防不存在

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

}

由于我是C#的新手,因此我搜索了各种解决方案,包括.ContainsEqual (在上面的Equal中添加了覆盖)。 我也知道我可以通过简单地使用where来实现比较。 但是,随着我可能在类中添加了更多元素,如果可能的话,我想坚持使用等于或包含。 我用来比较然后插入(如果不存在)的代码如下

internal void UpdateLocalMultiLing()
        {
            POCO.MultiLingualColumn _equals = new POCO.MultiLingualColumn()
            {
                ColumnName = InvoiceComment.Name.TrimEnd(),
                LanguageCode = inputLanguage,
                LanguageText = InvoiceComment.Value.TrimEnd()
            };

            if (!SupplierMultiLing.MultiLingColumnsCollection.Equals(_equals))
                SupplierMultiLing.MultiLingColumnsCollection.Add(new POCO.MultiLingualColumn
                {
                    ColumnName   = InvoiceComment.Name.Trim(),
                    LanguageCode = inputLanguage,
                    LanguageText = InvoiceComment.Value.Trim()
                }
                );
        }

但它会忽略条件,并再次添加相同的语言。 从所附图像可以看出。 在此处输入图片说明

请问我该如何解决?

您正在将列表与单个对象进行比较。 您需要.Contains()而不是.Equals()

适当地实现IEquatable<T> ,或重写Equals(object)GetHashCode() 什么Collection.Contains()检查现有对象?

在您的自定义类上实现IEquatable,或重写Equals(和GetHashCode)

此代码显示“ True”:

public class Foo : IEquatable<Foo>
{
    public string Bar { get; set; }

    public bool Equals(Foo other)
    {
        return other.Bar == this.Bar;
    }
}

public static void Main()
{
    var list = new List<Foo>
    {
        new Foo { Bar = "Baz" }
    };

    Console.WriteLine(list.Contains(new Foo { Bar = "Baz" }));
}

但是,由于@Jeppe正确注释,建议还为其他收集和比较类型提供正确的GetHashCode()实现。

您应该使用Contains()方法。 另外,您应该为MultiLingualColumn实现IEquatable接口或实现IEqualityComparer并将第二个参数传递给Contains() 我更喜欢第二种选择:

public class MultiLingualColumnComparer : IEqualityComparer<MultiLingualColumn>
{
    public bool Equals(MultiLingualColumn x, MultiLingualColumn y)
    {
        //...
    }

    public int GetHashCode(MultiLingualColumn obj)
    {
        //...
    }
}

接着:

if (!SupplierMultiLing.MultiLingColumnsCollection.Contains(_equals, new MultiLingualColumnComparer()))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM