powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# сравнить значения двух классов
25 сообщений из 32, страница 1 из 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
25 сообщений из 32, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / c# сравнить значения двух классов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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