Сравните два объекта на выбранных полях в C # - PullRequest
1 голос
/ 05 июля 2011

Код (это может быть псевдокод):

Person p1 = new Person { First = "John", Last = "Smith" };
Person p2 = new Person { First = "Jane", Last = "Smith" };

Я ищу способ сделать это:

bool b1 = Person.CompareOn({"First", "Last"}, p1, p2) // false;
bool b2 = Person.CompareOn({"Last"}         , p1, p2) // true;

Есть ли предопределенный метод, который делает это? Или мне самому написать?

Ответы [ 3 ]

3 голосов
/ 05 июля 2011

Нужно ли указывать имена свойств в виде строк, а не напрямую?

Вы можете написать собственную реализацию IEqualityComparer<T>, которая принимает проекцию, а затем также дать ейAndAlso метод для получения другой проекции.У меня есть первая часть в MiscUtil , а остальные не должны быть слишком сложными в использовании.

Вы бы использовали это примерно так:

// The first argument here is only for the sake of type inference
var comparer = PropertyEqualityComparer.WithExample(p1, p => p.First)
                                       .AndAlso(p => p.Last);
bool equal = comparer.Equals(p1, p2);

или:

var comparer = PropertyEqualityComparer<Person>.Create(p1, p => p.First)
                                               .AndAlso(p => p.Last);
bool equal = comparer.Equals(p1, p2);

К сожалению, вы не можете использовать params здесь, так как вы вполне можете захотеть, чтобы у каждой проекции был другой тип цели.

(Вы хотите создать один компаратор дляпо возможности каждый сценарий.)

0 голосов
/ 05 июля 2011

каждый класс в C # получен из основного класса: Object, и у него есть метод: equals (Object), который выполняет эту работу.Это метод, который вы должны переопределить

class Person {
     ...
     public bool Equals(Object o) {
          return (Person)o.LastName.Equals(this.LastName);
     }
 }

В этом примере вы должны проверить, является ли "o" нулевым или нет, я проверяю на равенство, используя фамилию.

0 голосов
/ 05 июля 2011

В классе Person:

public virtual bool Equals(Person obj){
        if (obj == null) return false;
        if (Equals(First, obj.First) == false) return false;
        if (Equals(Last, obj.Last) == false) return false;
        return true;
    }

Тогда вы можете сказать:

 if(person1.Equals(person2){
                    blah....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...