C # List <Object>.Equals не удается при сравнении объектов - PullRequest
0 голосов
/ 08 октября 2018

У меня есть класс, как показано ниже.К объекту этого класса мне нужно добавить новый язык, если он не существует

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 #, я искал различные решения, включая .Contains * 1005.* или Равен (откуда я добавил переопределение к своему Равенству выше).Я также понимаю, что могу добиться сравнения, просто используя там, где это .Тем не менее, поскольку у меня может быть добавлено больше элементов в класс, я хотел бы придерживаться либо Equal, либо Contains, если это возможно.Код, который я использую для сравнения, а затем для вставки, если он не существует, выглядит следующим образом:

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

, но он игнорирует условие и снова добавляет тот же язык.Это видно из прикрепленного изображения. enter image description here

Можно ли посоветовать, что мне исправить, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Вы должны использовать метод Contains().Также вы должны реализовать IEquatable интерфейс для MultiLingualColumn или 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()))
0 голосов
/ 08 октября 2018

Вы сравниваете список с одним объектом.Вам нужно .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() для других типов сбора и сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...