2012-09-13 2 views
1

Допустим, у меня есть следующий классПростой способ сравнить два объекта?

public class Test 
{ 
    public int prop1 { get;set; } 
    public string prop2 { get;set; } 
    public Type prop3 { get;set; } 
} 

Если у меня есть два экземпляра этого класса, что быстрый подход к сравнению объектов, но в то же время позволяя мне проверить, если свойство является то, что еще при условии, он не соответствовал свойствам других объектов. В настоящее время я просто делаю массу заявлений, но это похоже на плохой способ делать что-то.

Пример функциональности, которую я хочу; Если первый экземпляр prop1 не соответствовал prop1 второго экземпляра, я все же могу проверить, является ли prop1 из первого экземпляра 10 или чем-то.

Да, этот пример очень груб, но реальный код ОГРОМН, поэтому я не могу опубликовать его здесь.

Благодаря

EDIT

Должен отметить, что я не могу изменить класс Test, как я не владею.

+0

Может быть эта ссылка поможет .. используя IEquatable интерфейс http://stackoverflow.com/вопросы/411232/сравнивающие-два-объекты – Krishna

ответ

2

Вы можете создать свой собственный Comparer (непроверенный код)

public class TestComparer : IEqualityComparer<Test> 
{ 
    public bool Equals(Test x, Test y) 
    { 
     if(ReferenceEquals(x, y)) 
      return true; 

     if(ReferenceEquals(x, null) || ReferenceEquals(y, null)) 
      return false; 

     return x.prop1 == y.prop1 && 
       x.prop2 == y.prop2 && 
       x.prop3 == y.prop3; 
    } 

    public int GetHashCode(Test entry) 
    { 
     unchecked 
     { 
      int result = 37; 

      result *= 397; 
      result += entry.prop1.ToString().GetHashCode(); 
      result *= 397; 
      result += entry.prop2.GetHashCode(); 
      result *= 397; 
      result += entry.prop3.ToString().GetHashCode(); 

      return result; 
     } 
    } 
} 

, а затем просто позвонить:

Test a = new Test(); 
Test b = new Test(); 

var equal = new TestComparer().Equals(a, b); 
0

Не имея возможности редактировать сам класс, я бы сказал, что ваши варианты довольно ограничены. Вы всегда можете абстрагироваться от кода где-то и просто сделать функцию сравнения, которая принимает 2 объекта и возвращает bool.

public static bool Compare(Test test1, Test test2) 
{ 
    //May need to add some null checks 
    return (test1.prop1 == test2.prop1) 
     && (test1.prop2 == test2.prop2); 
    //...etc 
} 

Если вы на самом деле действительно есть же объект, а не только два объекта, которые происходят, чтобы иметь все те же значения свойств в этом случае вы можете просто сделать ...

if (test1 == test2) 

, но я угадываю из вашего вопроса, что это не так.

Смежные вопросы