Я не могу сравнить два объекта в моем приложении asp.net mvc - PullRequest
0 голосов
/ 26 сентября 2011

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

var t1 = repo.Model_Test_ViewAllBenefitCodes(2).OrderBy(p => p.ba_Object_id).ToArray();//.FirstOrDefault();
            var t2 = x.ViewAllBenefitCodes.OrderBy(p => p.ba_Object_id).ToArray();//.FirstOrDefault();


            for (int i = 0; i < t1.Count(); i++)
            {
                var res1 = t1[i]==(t2[i]);
                var res = t1[i].Equals(t2[i]);


                Assert.AreEqual(res, true);
            }

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

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

    Private Function Compare(ByVal Obj1 As Object, ByVal Obj2 As Object) As Boolean
    'We default the return value to false
    Dim ReturnValue As Boolean = False

    Try
        If Obj1.GetType() = Obj2.GetType() Then

            'Create a property info for each of our objects
            Dim PropertiesInfo1 As PropertyInfo() = Obj1.GetType().GetProperties()
            Dim PropertiesInfo2 As PropertyInfo() = Obj2.GetType().GetProperties()

            'loop through all of the properties in the first object and compare them to the second
            For Each pi As PropertyInfo In PropertiesInfo1
                Dim CheckPI As PropertyInfo
                Dim CheckPI2 As PropertyInfo
                Dim Value1 As New Object
                Dim Value2 As New Object

                'We have to do this because there are errors when iterating through lists
                CheckPI = pi
                'Here we pull out the property info matching the name of the 1st object
                CheckPI2 = (From i As PropertyInfo In PropertiesInfo2 Where i.Name = CheckPI.Name).FirstOrDefault

                'Here we get the values of the property
                Value1 = CType(CheckPI.GetValue(Obj1, Nothing), Object)
                Value2 = CType(CheckPI2.GetValue(Obj2, Nothing), Object)

                'If the objects values don't match, it return false
                If Object.Equals(Value1, Value2) = False Then
                    ReturnValue = False
                    Exit Try
                End If
            Next

            'We passed all of the checks!  Great Success!
            ReturnValue = True

        End If
    Catch ex As Exception
        HandleException(ex)
    End Try

    Return ReturnValue
End Function
1 голос
/ 26 сентября 2011

Если пользовательский объект в вашем распоряжении, то я переопределил Equals и GetHashCode, чтобы вернуть идентификатор объекта:

public override void Equals(object obj)
{
   if (obj == null || !(obj is MyObject))
       return false;

   return this.Key == ((MyObject)obj).Key;
}

public override int GetHashCode()
{
   return this.Key; 
   //or some other unique hash code combination, which could include
   //the type or other parameters, depending on your needs
}

Это сработало для меня особенно в сценариях с LINQ, где объекты, сгенерированные дизайнером, не сравнивались бы должным образом. Мне тоже иногда везет с Object.Equals(obj1, obj2).

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