powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# сравнить значения двух классов
32 сообщений из 32, показаны все 2 страниц
c# сравнить значения двух классов
    #39594589
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Подскажите пожалуйста, как сравнить значения свойств двух классов с разной структурой, но наследуемых один интерфейс?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public interface IA
{ 
    int Id { get; set; }
    string Name { get; set; }
}
public class A : IA
{ 
    public int Id { get; set; }
    public string Name { get; set; }
}
public class B : IA
{ 
    public int Id { get; set; }
    public string Name { get; set; }
    public string Test { get; set; }
}

IA c1 = new A (1, "1111");
IA c2 = new B (1, "1111", "2222");

if (c1 == c2) //Как правильно определить, что значения этих классов схожи относительно интерфейсов?
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594599
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заоверрайдить в обоих классах Equals / GetHashCode , в методах при удачной попытке приведения к интерфейсу сравнивать поля из интерфейса/вычислять хэшкод. Проверка на эквивалентность - методом Equals.
P.S. Желательно, чтобы поля, участвующие в определении эквивалентности/хэшкода, были неизменяемыми - это в будущем спасет от труднопонимаемых и трудновылавливаемых косяков.
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594605
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,
Сделайте их наследниками)
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594609
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Nechto,
Сделайте их наследниками)

Не совсем понял?
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594617
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Nechto,
Сделайте их наследниками)
И что это даст в вопросе сравнения экземпляров?
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594628
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
наследовать интерфейс от IEqualityComparer<T> https://msdn.microsoft.com/ru-ru/library/ms132151(v=vs.110).aspx и сравнивать с помощью интерфейса
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594629
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныPetro123Nechto,
Сделайте их наследниками)
И что это даст в вопросе сравнения экземпляров?сравнивать не придется.
Схожие классы не только интерфейсом делаются.
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594634
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Сон Веры Павловныпропущено...

И что это даст в вопросе сравнения экземпляров?сравнивать не придется.
Схожие классы не только интерфейсом делаются.
С чего же сравнивать не придется, когда автору требуется именно сравнить? И каким боком тут схожесть классов не только интерфейсом?
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594641
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
Ну понятно, что я расширил вопрос ТС
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594650
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Сон Веры Павловны,
Ну понятно, что я расширил вопрос ТС
Я сильно подозреваю, что направление расширения было понятно только расширившему.
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594675
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
По ООП в коде выше делают класс Б наследником над классом А или оба класса над абстрактным классом.
Профит может быть в полиморфизме.
Зы. Ещё у меня там смайлик был.
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594680
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
2. Интерфейс чаще применяют для изменения поведения класса. А не данных класса.
Но это все условно конечно.
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594686
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoЗдравствуйте!

Подскажите пожалуйста, как сравнить значения свойств двух классов с разной структурой, но наследуемых один интерфейс?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public interface IA
{ 
    int Id { get; set; }
    string Name { get; set; }
}
public class A : IA
{ 
    public int Id { get; set; }
    public string Name { get; set; }
}
public class B : IA
{ 
    public int Id { get; set; }
    public string Name { get; set; }
    public string Test { get; set; }
}

IA c1 = new A (1, "1111");
IA c2 = new B (1, "1111", "2222");

if (c1 == c2) //Как правильно определить, что значения этих классов схожи относительно интерфейсов?



(c1 as IA).Equals(c2 as IA)
ну и может понадобиться использование IEqualityComparer
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594716
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал так, работает.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public static bool EqualsEntity<T>(this T obj, T entity) where T : class
{
    var objProps = typeof(T).GetProperties();
    var entP1 = obj.GetType().GetProperties();
    var entP2 = entity.GetType().GetProperties(); 
    foreach (var objP in objProps)
    {
         var p1 = entP1.FirstOrDefault(w => w.Name == objP.Name);
         var p2 = entP2.FirstOrDefault(w => w.Name == objP.Name);
         if (p1 != null && p2 != null)
         {
              var v1 = p1.GetValue(obj);
              var v2 = p2.GetValue(entity);
              if (!v1.Equals(v2))
              {
                   return false;
              }
         }
    }
    return true;
}  
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594728
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,
Тормоза проверь на всякий.
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594736
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,

нафига городить такое для сравнения 2 классов? я бы еще понял, если объекты были упакованы и сравнение происходило где во View, но типы известны и определены, такое сравнение будет работать на порядок, если не на несколько медленнее. я бы такой код в CodeReview не пропустил в продакшн
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594742
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Сон Веры Павловны,
По ООП в коде выше делают класс Б наследником над классом А или оба класса над абстрактным классом.
Профит может быть в полиморфизме.
Зы. Ещё у меня там смайлик был.
Petro123Сон Веры Павловны,
2. Интерфейс чаще применяют для изменения поведения класса. А не данных класса.
Но это все условно конечно.
Это всё замечательно (и про всё это я в курсе), но это всё вообще не имеет никакого отношения к вопросу топикстартера. Может, еще поговорим про LOH? Или про интернирование строк? Так, чисто чтоб вопрос расширить.
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594747
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
monstrUNechtoЗдравствуйте!

Подскажите пожалуйста, как сравнить значения свойств двух классов с разной структурой, но наследуемых один интерфейс?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public interface IA
{ 
    int Id { get; set; }
    string Name { get; set; }
}
public class A : IA
{ 
    public int Id { get; set; }
    public string Name { get; set; }
}
public class B : IA
{ 
    public int Id { get; set; }
    public string Name { get; set; }
    public string Test { get; set; }
}

IA c1 = new A (1, "1111");
IA c2 = new B (1, "1111", "2222");

if (c1 == c2) //Как правильно определить, что значения этих классов схожи относительно интерфейсов?



(c1 as IA).Equals(c2 as IA)
Без переопределенного Equals здесь будет просто проверка равенства ссылок (а они разные).
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594760
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,
Ты так и не врубился что интерфейс придумал ТС?
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594762
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,
+1
ТС! Колись об исходной постановке. ОРМ?
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594817
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Roman Mejtes,
+1
ТС! Колись об исходной постановке. ОРМ?

А что тут делиться. Я пример опубликовал.

У меня в программе производится много расчетов, для этого я решил создать тесты. Они используются для проверки, после измененний алгоритма расчета, на рассчитанных ранее данных в БД.
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594823
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechtoтестыпсевдокод тестов.
Это если есть желание обсуждать или тормозит твое решение.
Удачи!
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594846
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public interface IA
{
    int Id { get; set; }
    string Name { get; set; }

    bool Compare(IA obj);
}

public abstract class SomeClassName : IA
{
    public int Id { get; set; }

    public string Name { get; set; }

    public bool Compare(IA obj)
    {
        return Id == obj.Id && Name == obj.Name;
    }
}

public class A : SomeClassName
{
      
}
public class B : SomeClassName
{
    public string Test { get; set; }
}
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594968
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Супер_ПавА если так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
public interface IA
{
    int Id { get; set; }
    string Name { get; set; }

    bool Compare(IA obj);
}

public abstract class SomeClassName : IA
{
    public int Id { get; set; }

    public string Name { get; set; }

    public bool Compare(IA obj)
    {
        return Id == obj.Id && Name == obj.Name;
    }
}

public class A : SomeClassName
{
      
}
public class B : SomeClassName
{
    public string Test { get; set; }
}



Человек понял что мне надо. Только я не хотел нагружать сущности абстрактными классами. К тому же в некоторых из них абстр классы уже используются.
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39594985
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoЧеловек понял что мне надо. Только я не хотел нагружать сущности абстрактными классами. К тому же в некоторых из них абстр классы уже используются.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
public static class ClassExtensions
{
    public static bool Compare(this IA source, IA obj)
    {
        return source.Id == obj.Id && source.Name == obj.Name;
    }
}

public interface IA
{
    int Id { get; set; }
    string Name { get; set; }
}

public class A : IA
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class B : IA
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Test { get; set; }
}

...

IA c1 = new A
{
    Name = "qqqqq",
    Id = 1
};
IA c2 = new B
{
    Name = "wwww",
    Id = 2
};
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39595004
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_Пав,
А без интерфейса?
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39595027
Супер_Пав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Супер_Пав,
А без интерфейса?
что без интерфейса? ТС привел код с интерфейсом же. Все решаемо
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39595054
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Супер_ПавPetro123Супер_Пав,
А без интерфейса?
что без интерфейса? ТС привел код с интерфейсом же. Все решаемо
Моё имхо, что без интерфейса IA тоже решаемо.
Удачи аффтару!
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39595420
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Супер_Павпропущено...

что без интерфейса? ТС привел код с интерфейсом же. Все решаемо
Моё имхо, что без интерфейса IA тоже решаемо.
Удачи аффтару!

Ну вы хотя бы пример привели, как вы предлагаете решить данную задачу. Причем тут удачи? Если вы знаете как это можно оптимизировать, почему не даете примера?
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39595442
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nechto,
Мне уже 2 профи сказали тему не расширять. Интерфейс есть в ТЗ.
Извини, желание пропало.
Тем более что скорость тебе не важна. Значит работать будут все варианты.
Даже:
Утилитес.сравнить(А а, Б б) ;
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39595449
Nechto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123Nechto,
Мне уже 2 профи сказали тему не расширять. Интерфейс есть в ТЗ.
Извини, желание пропало.
Тем более что скорость тебе не важна. Значит работать будут все варианты.
Даже:
Утилитес.сравнить(А а, Б б) ;

:)
...
Рейтинг: 0 / 0
c# сравнить значения двух классов
    #39595993
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NechtoУ меня в программе производится много расчетов, для этого я решил создать тесты. Они используются для проверки, после измененний алгоритма расчета, на рассчитанных ранее данных в БД.

Для сравнения объектов в тестах можно использовать готовые штуки - например Compare Net Objects или Fluent Assertions .
...
Рейтинг: 0 / 0
32 сообщений из 32, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# сравнить значения двух классов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]