2015-02-18 14 views
1

У меня есть класс, определяемый как:Как сравнить все элементы пользовательского созданного класса

public class TableInfo 
{ 
    public int item_id { get; set:} 
    public string item_name { get; set;} 
    // plus several more 
} 

создать два экземпляра этого класса, наполненной различной информацией и хотите, чтобы сравнить их. Я делал это с трудом:

if(table1[index1].item_id == table2[index2].item_id) 
    //report passed 
else 
    //report failed 

, а затем повторить это для каждого элемента в классе.

if(table1[index1].item_name == table2[index2].item_name) 

и так далее.

Есть ли лучший способ справиться с этим, так что мне не нужно проходить уникальное сравнение каждого отдельного элемента. Мне кажется, что foreach мог это сделать, но я не уверен, как получить список свойств и перебрать их.

+0

, когда не просто использовать '' && оператор для объединения нескольких сравнений? –

+1

Вы можете просто реализовать 'Equals (TableInfo)' и/или перегрузить оператор '=='. –

ответ

4

Вы можете осуществить сравнение равенства класса, а затем сравнить его с помощью Equals:

public class TableInfo 
{ 
    public int item_id { get; set;} 
    public string item_name { get; set;} 

    public override bool Equals(object obj) 
    { 
     if(obj == null) 
      return false; 
     if (ReferenceEquals(obj, this)) 
      return true; 
     if (obj.GetType() != this.GetType()) 
      return false; 
     var rhs = obj as TableInfo; 
     return item_id == rhs.item_id && item_name == rhs.item_name; 
    } 

    public override int GetHashCode() 
    { 
     return item_id.GetHashCode()^item_name.GetHashCode(); 
    } 

    // Additionally you can overload == and != operators: 
    public static bool operator ==(TableInfo x, TableInfo y) 
    { 
     return object.Equals(x, y); 
    } 

    public static bool operator !=(TableInfo x, TableInfo y) 
    { 
     return !object.Equals(x, y); 
    } 
} 

Тогда вместо того, чтобы использовать

if(table1[index1].item_id == table2[index2].item_id) 

вы можете использовать

if(table1[index1].Equals(table2[index2])) 

Или, если операторы перегружены, вы можете использовать

if(table1[index1] == table2[index2]) 
0

Вы можете решить с Reflection Просто показывая другой способ сделать это, но реализация сравнения равенства будет чище

этот фрагмент будет сравнивать только общие свойства

static bool IsFullyEqual(object obj1, object obj2) 
    { 
     if (obj1.GetType() != obj2.GetType()) return false; 

     bool result = true; 
     foreach (var property in obj1.GetType().GetProperties()) 
     { 
      object obj1Value = property.GetMethod.Invoke(obj1, null); 
      object obj2Value = property.GetMethod.Invoke(obj2, null); 
      if(obj1Value.GetHashCode()!= obj2Value.GetHashCode()) 
      { 
       result = false; 
       break; 
      } 
     } 
     return result; 
    } 
0

Если вы только сравнения двух элементов, вы можете использовать Type.GetType(). GetProperties() метод, который возвращает массив всех открытых свойств в объекте , Отсюда вы можете использовать ваш цикл foreach для повторения каждого свойства по типу и сравнения ваших полей.

https://msdn.microsoft.com/en-us/library/aky14axb%28v=vs.110%29.aspx

+0

Как именно я буду использовать это в этом случае? Ваше предложение похоже на то, что я пытаюсь выполнить. Я не могу правильно получить синтаксис. –

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