2014-11-07 2 views
0

Я хотел бы знать лучший способ сравнить 2 сложных объекта, чтобы узнать, равны ли они по значению, т. Е. Их свойства одинаковы? Я попробовал метод сериализации и не знаю, почему они не равны по значениюсравнить значение равенства объектов

Dim stream As New MemoryStream() 
    Dim bstream As New MemoryStream() 

    Dim clientOne As Jewellery.ClientInfo = New Jewellery.ClientInfo(New Jewellery.Company("a", "", "", "b", "", "e"), New Jewellery.Customer("a", "b", "c", "d", "", "", "", "f")) 
    Dim clientTwo As Jewellery.ClientInfo = New Jewellery.ClientInfo(New Jewellery.Company("a", "", "", "b", "", "e"), New Jewellery.Customer("a", "b", "c", "d", "", "", "", "f")) 

    formatter.Serialize(stream, clientOne) 
    formatter.Serialize(bstream, clientTwo) 

    Dim streamOneBytes As Byte() = stream.ToArray() 
    Dim streamTwoBytes As Byte() = bstream.ToArray() 
    Dim streamToCompareBytes As Byte() = streamToCompare.ToArray() 
    Dim i As Int16 = 0 
    Dim flag As Boolean 

    If streamOneBytes.Length <> streamTwoBytes.Length Then 

     MsgBox("False") 
     flag = False 
    Else 
     While i < streamOneBytes.Count 

      If streamOneBytes(i) <> streamTwoBytes(i) Then 
       flag = "False"     
      Else : flag = "True"      
      End If 

      i = i + 1 

     End While 

    End If 

Как вы видите, в приведенном выше коде, когда я инициализировать 2 объекта одного и того же типа и сравнения, он работает правильно. Но когда я добавляю один объект, чтобы сказать список, а затем извлекать и сравнивать с объектом подобного типа, он не говорит о том, что бинарная ширина отличается для обоих. Любой совет? Спасибо

+0

Возможно, вы захотите пересмотреть метод '' Equals' '(http://msdn.microsoft.com/en-us/library/bsc2ak47 (v = vs.110) .aspx) –

+0

Если clientInfo.Equals (CType (Me.FindResource («clientInfo»), Jewellery.ClientInfo) .ClientRegistrationList.Item (1)) Затем MsgBox («True») Else: MsgBox («False») End If – user2043688

+0

Пробовал вышеуказанный код, но он не работает с Equals. – user2043688

ответ

0

Я не уверен, что я понимаю, что вы хотите сделать. Итак, я иду с IComparable<T>.

+0

Я хочу сравнить 2 объекта ClientInfo, как в приведенном выше коде, чтобы узнать, содержат ли они одну и ту же информацию в полях, таких как NAME, SURNAME, и т. д. без фактического выполнения Equals вручную для каждого поля в сравниваемых объектах. В приведенном выше коде я инициализировал 2 объекта ClientInfo, как вы видите с именем клиента Firstname = «a», Surname = «b» для демонстрации. Таким образом, в принципе, эти 2 объекта для меня одинаковы. Если одно из полей отличается, то оно не равно. Итак, если я переопределяю Equals, мне нужно будет сравнить каждое имя, фамилию и т. Д. Для каждого объекта, который я хочу пропустить – user2043688

0
public class IntegerPropertyEqualityCompare : IEqualityComparer<Main> 
{ 
    #region IEqualityComparer<Main> Members 

    public bool Equals(Main x, Main y) 
    { 
     return x.IntegerProperty == y.IntegerProperty; 
    } 

    public int GetHashCode(Main obj) 
    { 
     return obj.IntegerProperty.GetHashCode()^obj.StringProperty.GetHashCode(); 
    } 

    #endregion 
} 

public class StringPropertyEqualityCompare : IEqualityComparer<Main> 
{ 
    #region IEqualityComparer<Main> Members 

    public bool Equals(Main x, Main y) 
    { 
     return x.StringProperty == y.StringProperty; 
    } 

    public int GetHashCode(Main obj) 
    { 
     return obj.IntegerProperty.GetHashCode()^obj.StringProperty.GetHashCode(); 
    } 

    #endregion 
} 

public class AllPropertiesEqualityCompare : IEqualityComparer<Main> 
{ 
    #region IEqualityComparer<Main> Members 

    public bool Equals(Main x, Main y) 
    { 
     return (x.IntegerProperty == y.IntegerProperty) && (x.StringProperty == y.StringProperty); 
    } 

    public int GetHashCode(Main obj) 
    { 
     return obj.IntegerProperty.GetHashCode()^obj.StringProperty.GetHashCode(); 
    } 

    #endregion 
} 



public abstract class Main 
{ 
    public int IntegerProperty { get; set; } 
    public string StringProperty { get; set; } 

    public bool Equals(IEqualityComparer<Main> comparer, Main other) 
    { 
     return comparer.Equals(this, other); 
    } 
} 

public class ConcreteA : Main 
{ } 

public class ConcreteB : Main 
{ } 




class TemporaryTest 
{ 
    public static void Run() 
    { 
     var a = new ConcreteA(); 

     a.IntegerProperty = 1; 
     a.StringProperty = "some"; 

     var b = new ConcreteB(); 
     b.IntegerProperty = 1; 
     a.StringProperty = "other"; 

     Console.WriteLine(a.Equals(new IntegerPropertyEqualityCompare(), b)); 
     Console.WriteLine(a.Equals(new StringPropertyEqualityCompare(), b)); 
     Console.WriteLine(a.Equals(new AllPropertiesEqualityCompare(), b)); 
    } 
} 

Возможно, тогда что-то вроде этого?

+0

Привет тень. Спасибо за код, хотя я еще не пробовал, работал над некоторым другим кодом. Кажется довольно сложным, хотя для меня, потому что мне было бы проще просто перезаписать Equals, как предложил Джеймс для полей, которые мне нужно сравнить в соответствии с моими бизнес-правилами? Причина, по которой я хотел реализовать сравнение байтов, заключалась в сокращении объема работы и сложного кода. – user2043688

+0

Наверняка вы можете просто переопределить метод Equals. Это самый простой и в некоторых случаях наиболее эффективный способ с точки зрения сложности/простоты проекта или времени и времени, которое у вас на руках. Пример, который я написал, дает вам больше свободы и гибкости. Это не сложно. ;-) – shadow

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