Сравнить 2 объекта класса и игнорировать 1 (или более) свойство? - PullRequest
0 голосов
/ 16 ноября 2018

Итак, я создал такой класс:

public class ClassName
{
public int ID;

public String n_1 {get; set; }
public String n_2 {get; set; }
// ....
public String n_x {get; set; }
}

Позже в моем коде я сравниваю 2 ClassName объекта:

ClassName Item_1 /*...*/ ;
ClassName Item_2 /*...*/ ;

Примерно так:

if (Item_1 != Item_2 && Item_1.n_a == Item_2.n_a)
{
//do something
}

Теперь моя проблема в том, что Item_1.ID и Item_2.ID следует игнорировать.Есть ли простой способ сделать это?Единственное решение, которое я придумала, - это ежу понятно, вроде

if ( (Item_1.n_1 != Item_2.n_1 || Item_1.n_2 != Item_2.n_2 || /* ... */ ) && Item_1.n_a == Item_2.n_a)

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Простой способ - это то, что вы на самом деле делаете, просто создайте метод, подобный этому

    public bool Method(ClassName Item_1,ClassName Item2)
    {
    bool check=false;
    if ( (Item_1.n_1 != Item_2.n_1 || Item_1.n_2 != Item_2.n_2 || /* ... */ ) && Item_1.n_a == Item_2.n_a)
    check=true

return check
    }
0 голосов
/ 16 ноября 2018

Чтобы выполнить что-то вроде Item_1 != Item_2 или Item_1 == Item_2 и получить все свойства (или те, которые вы хотите) для сравнения, вам необходимо реализовать собственный метод Equals и перегрузки операторов ==, !=.

== оператор, от MSDN :

Для ссылочных типов, кроме строки, == возвращает true, если два его операндаобратитесь к тому же объекту.

Для этого вы можете начать с простого решения, реализовать интерфейс IEquatable<T>, заполнить логику сравнения внутри метода Equals и перегрузить == и !=операторы внутренне вызывают ваш типобезопасный Equals метод:

public class ClassName : IEquatable<ClassName>
{
    public int ID;

    public String n_1 { get; set; }
    public String n_2 { get; set; }
    // ....
    public String n_x { get; set; }

    public static bool operator ==(ClassName obj1, ClassName obj2)
    {
        if (((object)obj1) == null || ((object)obj2) == null)
            return Equals(obj1, obj2);
        return obj1.Equals(obj2);
    }

    public static bool operator != (ClassName obj1, ClassName obj2)
    {
        if (((object)obj1) == null || ((object)obj2) == null)
            return !Equals(obj1, obj2);
        return !obj1.Equals(obj2);
    }


    public bool Equals(ClassName obj)
    {
        if (obj == null) return false;

        return (n_1 == obj.n_1) && (n_2 == obj.n_2) && (n_x == obj.n_x); //you can ignore ID here
    }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        ClassName classNameObj = obj as ClassName;
        if (classNameObj == null)
            return false;
        else
            return Equals(classNameObj);
    }

    public override int GetHashCode()
    {
        //This code was generated by VS ide, you can write your own hashing logic
        var hashCode = 1032198799;
        hashCode = hashCode * -1521134295 + ID.GetHashCode();
        hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(n_1);
        hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(n_2);
        hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(n_x);
        return hashCode;
    }
}

Затем вы можете проверить свой if:

if (Item_1 != Item_2)
{
    //Do Something
}

Для Equals метода вы должны придерживаться Рекомендации по переопределению равенства () и оператора == .

Ссылки: == Оператор , ! = Оператор , IEquatable интерфейс , IEquatable.Equals (T) Метод , Рекомендации по переопределению Equals () и оператора ==

0 голосов
/ 16 ноября 2018

Переопределите метод object.Equals в своем классе и укажите, как вы хотите, чтобы он сравнивался.

Затем используйте !Item1.Equals(Item2) вместо !=

https://docs.microsoft.com/en-us/dotnet/api/system.object.equals?view=netframework-4.7.2

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