Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
Заблокирован

Метод сравнения объектов пользовательского класса

02.08.2020, 16:48. Показов 7370. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать метод сравнения достаточно сложных объектов пользовательского класса - для сортировки массива этих объектов.
Вижу, что есть два интерфейса: IComparable и IComparer
А может и ещё что-то есть (не знаю).
Какой из них использовать?
P.S.1. Не знаю важно это или нет, но сообщаю - эти объекты с рекурсией, то бишь, содержат в себе вложенные объекты того же типа (точнее - массив таких объектов).
P.S.2. Можно, конечно, вообще никакие интерфейсы не притягивать, но захотелось сделать правильно - задача-то стандартная и значит вроде нужно обозначить использование стандартного интерфейса))) Какого?


Добавлено через 12 минут
P.S.3. А тут ваще не получится "зацикливания"?
Есть массив объектов.
Каждый элемент массива тоже содержит массив объектов этого типа (возможно и нулевой длины).
Чтобы отсортировать массив, нужно иметь метод сравнения элементов. Но чтобы сравнивать элементы массива - объекты - нужно ведь уметь сортировать массив объектов, вложенный в каждый элемент массива (объект) ???)))
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2020, 16:48
Ответы с готовыми решениями:

Программа, использующая массив объектов пользовательского класса
Написать код программы, в которой реализовать следующие действия: - инициализировать массив из 5 элементов, каждый элемент которого...

Во всех классах реализовать интерфейс IComparable и перегрузить метод CompareTo для сравнения объектов
В программах требуется описать базовый класс (возможно, абстрактный), в котором задается интерфейс для производных классов. Во всех классах...

Для массива объектов класса «Студент» создать метод сортировки по различным критериям
Для массива объектов класса «Студент» создать метод сортировки по различным критериям (по фамилии, по среднему баллу успеваемости). Метод...

27
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
04.08.2020, 21:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от titan4ik Посмотреть сообщение
Почему это плюс?
Да впринципе не такой уж и плюс, если подумать. Можно заменить и на вызов не через объект, наверное просто дело вкуса.

Цитата Сообщение от titan4ik Посмотреть сообщение
Возражений нет?
Думаю this тут больше декоративный характер имеет, чтобы программисту было понятно, что данный элемент объявлен именно в этом классе, а не в базовом классе. Что касается else, то, наверное, это сделано в угоду масштабируемости программы. Если по какой то причине в будущем вместо return в каждой строке будет сохранение значения в переменную, то придется переписывать больше кода.
1
Заблокирован
05.08.2020, 15:04  [ТС]
Попутная тема - сравнение на равенство - переопределение метода Equals ит.п.
Поскольку более-менее разобрался методами Compare и CompareTo, и реализовал в нужном классе метод CompareTo,
то есть соблазн не делать ещё и метод Equals с полной реализацией, а просто использовать уже определенный метод CompareTo
Ведь он при равенстве выдает ноль.
То есть, код такой:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
 public static bool Equals(MyClass obj1, MyClass obj2)
        {
            if (obj1.CompareTo(obj2) == 0) return true;
            return false;
        }
 
 public bool Equals(MyClass other)
        {
            if (this.CompareTo(other) == 0) return true;
            return false;
        }

Нет ли в таком подходе крамолы?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.08.2020, 16:44
Цитата Сообщение от titan4ik Посмотреть сообщение
есть соблазн не делать ещё и метод Equals с полной реализацией
Если делаете полную реализацию сравнения на идентичность, то не забудьте переопределить Equals, GetHashCode и реализовать IEquatable<MyClass>.

Цитата Сообщение от titan4ik Посмотреть сообщение
Нет ли в таком подходе крамолы?
Хороший, верный подход: иметь реализацию в одном месте и использовать ее во всех перегрузках.
Небольшой рефакторинг:
C#
1
2
3
4
5
6
7
8
9
10
11
public static bool Compare(MyClass a, MyClass b) 
{
   if (ReferenceEquals(a, b)) return true;
   if (a == null) return -1;
   if (b == null) return 1;
 
   return /* Реализация сравнения по свойствам */
}
 
public static bool Equals(MyClass obj1, MyClass obj2) => Compare(obj1, obj2) == 0;
public bool Equals(MyClass other) => Equals(this, other);
1
Заблокирован
05.08.2020, 17:20  [ТС]
kolorotur,
вы какого-то мутанта зафигачили)
Наверное, вы имели ввиду вот это:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
public static int Compare(MyClass a, MyClass b) 
{
   if (ReferenceEquals(a, b)) return 0;
   if (a == null) return -1;
   if (b == null) return 1;
 
   return /* Реализация сравнения по свойствам */
}
 
public static bool Equals(MyClass obj1, MyClass obj2) => Compare(obj1, obj2) == 0;
public bool Equals(MyClass other) => Equals(this, other);
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.08.2020, 22:19
titan4ik, в чем мутация? В опечатке чтоли?
Ну простите - бывает. Первый метод int должен возвращать.
0
Заблокирован
05.08.2020, 22:32  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
в чем мутация? В опечатке чтоли?
Ага) Там две опечатки. Просто ваш авторитет настолько силен, что... сначала десять раз подумаешь, что что-то не понял, чем поверишь в опечатку.
Для справки - в случае с док майкросфта я теперь только 5 раз думаю, что не понял.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
05.08.2020, 22:37
titan4ik, мне кажется вы зря пытаетесь найти "идеальные решения", тратя на это кучу времени. Делайте так как кажется правильным, когда наступите на какие-нибудь грабли, исправитесь, или когда наберетесь опыта, это будет гораздо быстрее, чем заниматься подобными теоретическими изысканиями.
0
Заблокирован
05.08.2020, 22:46  [ТС]
QuakerRUS,
постараюсь учесть, но это субъективно наверное. Я-то считаю, что занимаюсь не теорией а сугубо практикой. А грабли у меня из каждой пятки пучками торчат).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.08.2020, 22:46

Задать метод события для множества объектов одного класса
Здравствуйте! Вынужден обратиться к опытным людям за советом. Имеется форма, на которой есть 60 label'ов. Необходимо, чтобы при событии...

Дополнительный метод сравнения объектов класса
Имеется класс для которого уже реализован интерфейс Comparable и перегружен метод compareTo. Сравниваются объекты лексикографически, а...

Вектор объектов пользовательского класса
Привет всем! Есть класс Automaton, я пытаюсь создать вектор Sample с объектами этого класса, а они ведут себя не так, как я ожидаю -...

Подсчет созданных объектов пользовательского класса
Создать класс SIGMOID таким образом, чтобы при уничтожении последнего объекта на экран выдавалось сообщение о наибольшее количество...

Очистка вектора объектов пользовательского класса
Здравствуйте. Есть вектор std::vector&lt;Morphology*&gt; MorphCollection который заполняется следующим образом: Morphology *Morph = new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru