Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 25.06.2016
Сообщений: 4
.NET 4.x

Интерфейс IComparable, метод CompareTo

25.06.2016, 18:35. Показов 2923. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
39
40
41
42
43
public class Car:IComparable
    {
       public int CarID { get; set; }
       public int CurrentSpeed { get; set; }
       public string PetName { get; set; }
       public Car(string name,int currSp,int id)
       {
           CurrentSpeed = currSp;
           PetName = name;
           CarID = id;
       }
       public Car() { }
 
       int IComparable.CompareTo(object obj)
       {
           Car temp = obj as Car;
           if (temp != null)
               return this.CarID.CompareTo(temp.CarID);
           else
               throw new ArgumentException("Param isn't a Car");
       }
    }
 
static void Main(string[] args)
        {
            Car[] my =new Car[5];
            my[0] = new Car("A", 10, 1);
            my[1] = new Car("B", 20, 5);
            my[2] = new Car("C", 30, 4);
            my[3] = new Car("D", 40, 3);
            my[4] = new Car("E", 50, 2);
            foreach(Car c in my)
            {
                Console.WriteLine("{0} {1}",c.CarID,c.PetName);
            }
            Array.Sort(my);
            Console.WriteLine();
            Console.WriteLine("here is the ordered set of cars:");
            foreach(Car c in my)
            {
                Console.WriteLine("{0} {1}", c.CarID, c.PetName);
            }
        }
Всем привет,хелп!!!Объясните пожалуйста,что с чем сравнивается вот здесь- IComparable.CompareTo(object obj). Смотрел в режиме дебаг,пробовал сам разобрать,не понимаю,особенно откуда такие цифры берутся(я про дебаг),поясните пожалуйста конкретно на цифрах что с чем сравнивается и что возвращается после каждой итерации в реализации CompareTo().Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.06.2016, 18:35
Ответы с готовыми решениями:

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

Как работает метод CompareTo(), реализующий интерфейс
Собственно,вот и сама программа. using System; using System.Collections; // Реализовать необобщенный вариант интерфейса IComparable. ...

Интерфейс расширяет IComparable<>
Есть задача, в которой нужно расширить своим интерфейсом интерфейс IComparable&lt;&gt;. Как решить проблему CS0535: 'class' does not implement...

10
0 / 0 / 1
Регистрация: 25.06.2016
Сообщений: 6
25.06.2016, 19:23
https://msdn.microsoft.com/ru-... .110).aspx
у вас сравнивается значение CarID текущего экземпляра с CarID другого экземпляра, если равны - возвращается 0, если значение CarID данного экземпляра меньше CarID другого экземпляра - возвращается -1, если больше вернётся 1.
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
25.06.2016, 19:30
Code
1
2
3
my[0] = new Car("A", 10, 1);
//
Car(string name, int currSp, int id)
Что не понятно?
Car делается по конструктору, в классе реализован IComparable реализующий сравнение по третьему(CarID = id; - третий в конструкторе) пораметру.
Кликните здесь для просмотра всего текста

C#
1
2
3
                Car temp = obj as Car; //потому что object, т.е. IComparable.CompareTo(object obj)
                if (temp != null)
                    return CarID.CompareTo(temp.CarID);


А вывод такой:
Code
1
2
3
Console.WriteLine("{0} {1}", c.CarID, c.PetName);
Array.Sort(my); // сортировка IComparable id
Console.WriteLine("{0} {1}", c.CarID, c.PetName);
Добавлено через 5 минут
Добавлю:
https://msdn.microsoft.com/ru-... .110).aspx
0
0 / 0 / 0
Регистрация: 25.06.2016
Сообщений: 4
25.06.2016, 19:35  [ТС]
Добавлено через 2 минуты
Все,что вы написали это понятно и очевидно.Как я понял,мы передаем id=1(ибо первый объект массива),он сравнивается с temp.CarID,так вот,чему этот temp.CarID равен?и откуда значения для него вообще берутся?
0
 Аватар для EveKS
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
25.06.2016, 19:44
anikinho,
C#
1
2
3
4
5
6
       public Car(string name,int currSp,int id)
       {
           CurrentSpeed = currSp;
           PetName = name;
           CarID = id;
       }
Добавлено через 5 минут
Цитата Сообщение от EveKS Посмотреть сообщение
C#
1
2
Car temp = obj as Car; //потому что object, т.е. IComparable.CompareTo(object obj)
if (temp != null) return CarID.CompareTo(temp.CarID);
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
int IComparable.CompareTo(object obj)
            {
                Car temp = obj as Car;
                if (temp != null)
                    return CarID.CompareTo(temp.CarID);
                else
                    throw new ArgumentException("Param isn't a Car");
            }


https://msdn.microsoft.com/ru-... sdfbt.aspx
0
0 / 0 / 0
Регистрация: 25.06.2016
Сообщений: 4
25.06.2016, 20:01  [ТС]
Все равно не понимаю,лол.Вот что показывает дебаг:1 проход- this=5,obj=1(почему this=5? ,obj=1,предполагаю это id my[0]), 2 проход- this=4,obj=5, 3 проход- this=4,obj=1(почему obj=1? id m[2]=4, а не 1). Как они вообще сравниваются? И на что влияет возвращающее значение?Получается,что оно всегда будет возвращать число >0.Или я не в том русле рассуждаю?
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
25.06.2016, 20:06
Цитата Сообщение от anikinho Посмотреть сообщение
Как они вообще сравниваются?
Если уж сильно хочется узнать, можно залезть в исходники метода Array.Sort.
0
0 / 0 / 0
Регистрация: 25.06.2016
Сообщений: 4
25.06.2016, 20:08  [ТС]
то есть это скрыто от пользователя?
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
25.06.2016, 20:19
Цитата Сообщение от anikinho Посмотреть сообщение
то есть это скрыто от пользователя?
Ну да, внутренняя реализация скрыта.

Из MSDN про Array.Sort:
Sorts the elements in an entire one-dimensional Array using the IComparable implementation of each element of the Array.
Очевидно, используется IComparable объектов массива.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
25.06.2016, 20:23
anikinho,
Класс реализует интерфейс IComparable, определяя в классе метод CompareTo (можно попытаться отсортировать и без него. Компилятор пропустит, но при выполнении программы получим исключение). Этот метод используется методом Array.Sort для сравнения 2-х элементов массива и перестановки их в массиве в зависимости от результата, возвращенного методом CompareTo.
Когда происходит сравнение 2-х экземпляров класса, например при сортировке, то автоматически вызывается метод CompareTo. В этом методе сравнивается текущий экземпляр класса (this) и очередной (obj) из массива.
В методе сравниваются поля этих экземпляров и возвращается значение 1, 0 или -1 в зависимости от результата сравнения. В зависимости от возвращенного в метод сортировки значения экземпляры либо меняются местами в массиве, либо нет.
Какой именно алгоритм сортировки использует здесь метод Array.Sort я не знаю.
MSDN ( https://msdn.microsoft.com/ru-... .110).aspx ) гласит:
"Этот метод использует интроспективный алгоритм сортировки (introsort) следующим образом:
Если размер раздела меньше 16 элементов, он использует алгоритм сортировки вставкой.
Если количество элементов превышает 2 * Log N, где N диапазон входного массива, он использует алгоритм Heapsort.
В противном случае, он использует Quicksort алгоритм."
Так вот. При любом алгоритме сортировки элементы массива сравниваются и сравнение это выполняется именно методом CompareTo.
3
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
25.06.2016, 20:24
Внутри используется такая функция:
C#
1
2
3
4
5
[System.Security.SecurityCritical]  // auto-generated
        [ResourceExposure(ResourceScope.None)]
        [MethodImplAttribute(MethodImplOptions.InternalCall)]
        [ReliabilityContract(Consistency.MayCorruptInstance, Cer.MayFail)]
        private static extern bool TrySZSort(Array keys, Array items, int left, int right);
Если верить SO, то логика этого метода зашита внутри com-объекта самой CLR:
That method is implemented in native code, internal within the CLR itself. There are many methods like this on the very core, low level types. For example, quite a few of the methods on System.String are flagged InternalCall and implemented in the common language runtime itself.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.06.2016, 20:24
Помогаю со студенческими работами здесь

Реализовать интерфейс IComparable и перегрузить операции отношения
Задание (лаб. 9): 1. Создать абстрактный класс Persona с методами, позволяющим вывести на экран информацию о персоне, а также определить...

Как реализовать интерфейс IComparable в индексируемом классе
Как реализовать интерфейс IComparable, если невозможно доступиться до индексируемых полей внутри самого индексируемого класса. ...

Как реализовать интерфейс IComparable в этой программе?
Надо выполнить данную программу используя для хранения экземпляров разработанных классов стандартные параметризованные коллекции. Во всех...

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

Сортировка коллекции, используя интерфейс IComparable или IComparer
Добрый день! Мне нужно отсортировать список по зарплате. Сейчас я реализовала сортировку только тогда, когда список содержит экземпляры...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru