С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 30.05.2015
Сообщений: 130

Сортировка коллекции, используя интерфейс IComparable или IComparer

19.12.2018, 15:33. Показов 2400. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Мне нужно отсортировать список по зарплате. Сейчас я реализовала сортировку только тогда, когда список содержит экземпляры одного потомка. Как мне сделать чтобы список сортировался, когда он содержит экземпляры двух потомков?
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace regular1
{
    public abstract class Worker : IComparable
    {
        public string Name;
        protected int Identifikator;
        public int CompareTo(object obj)
        {
            HourlyPayment temp;
            temp = (HourlyPayment)obj;
            if (this.Wage() != temp.Wage())
            {
                if (this.Wage() > (temp.Wage())) return 1;
                if (this.Wage() < (temp.Wage())) return -1;
                else return 0;
            }
            else
                return this.Name.CompareTo(temp.Name);
        }
        public abstract double Wage();
        public abstract void Show();
        public abstract void SetParametrs();
    }
    class HourlyPayment : Worker//, IComparable
    {
        double HourlyRate; // почасовая ставка
        public override void SetParametrs()
        {
            Console.WriteLine("Введите идентификатор рабочего: ");
            Identifikator = int.Parse(Console.ReadLine());
            Console.WriteLine("Введите имя рабочего: ");
            Name = Console.ReadLine();
            Console.WriteLine("Введите почасовую ставку работника: ");
            HourlyRate = double.Parse(Console.ReadLine());
        }
        public override double Wage()
        {
            return 20.8 * 8 * HourlyRate;
        }
        public override void Show()
        {
            Console.WriteLine("Идентификатор рабочего: " + Identifikator.ToString() + '\n' + "Имя рабочего: " + Name + '\n' + "Среднемесячная заработная плата: " + Wage().ToString());
        }
        public HourlyPayment() : base()
        {
            Name = "none";
            Identifikator = 0;
            HourlyRate = 0;
        }
        public HourlyPayment(string name, int identifikator, double hourlyrate) : base()
        {
            Name = name;
            Identifikator = identifikator;
            HourlyRate = hourlyrate;
        }
 
    }
    class FixedPayment : Worker//, IComparable
    {
        protected double MonthlySalary; //месячная заработная плата
        public FixedPayment() : base()
        {
            Name = "none";
            Identifikator = 0;
            MonthlySalary = 0;
        }
        public override void SetParametrs()
        {
            Console.WriteLine("Введите идентификатор рабочего: ");
            Identifikator = int.Parse(Console.ReadLine());
            Console.WriteLine("Введите имя рабочего: ");
            Name = Console.ReadLine();
            Console.WriteLine("Введите месячную заработную плату работника: ");
            MonthlySalary = double.Parse(Console.ReadLine());
        }
        public override void Show()
        {
            Console.WriteLine("Идентификатор рабочего: " + Identifikator.ToString() + '\n' + "Имя рабочего: " + Name + '\n' + "Среднемесячная заработная плата: " + Wage().ToString());
        }
        public FixedPayment(string name, int identifikator, double monthlysalary) : base()
        {
            Name = name;
            Identifikator = identifikator;
            MonthlySalary = monthlysalary;
        }
        public override double Wage()
        {
            return MonthlySalary;
        }
        /* public int CompareTo(object obj)
         {
             FixedPayment temp;
             temp = (FixedPayment)obj;
             if (this.Identifikator > (temp.Identifikator)) return 1;
             if (this.Identifikator > (temp.Identifikator)) return -1;
             else return 0;
         }*/
    }
    class Program
    {
        static void Main(string[] args)
        {
            bool state = true;
            int k;
            List<Worker> MyList = new List<Worker>();
            while (state)
            {
                Console.WriteLine("1. Добавление работника с почасовой оплатой.");
                Console.WriteLine("2. Добавление работника с фиксированной оплатой.");
                Console.WriteLine("3. Просмотр работников.");
                Console.WriteLine("4. Дабавление работников из файла.");
                Console.WriteLine("5. Сортировка списка. ");
                Console.WriteLine("6. Выход.");
                Console.WriteLine("Выберите одно из предложенных действий: ");
                k = int.Parse(Console.ReadLine());
                switch (k)
                {
                    case 1:
                        HourlyPayment a2 = new HourlyPayment();
                        a2.SetParametrs();
                        MyList.Add(a2);
 
                        break;
                    case 2:
                        FixedPayment a1 = new FixedPayment();
                        a1.SetParametrs();
                        MyList.Add(a1);
                        break;
                    case 3:
                        if (MyList.Count == 0) Console.WriteLine("Работников нет! Добавьте хотя бы одного работника!");
                        else for (int i = 0; i < MyList.Count; i++)
                            {
                                MyList[i].Show();
                                Console.WriteLine();
                            }
                        break;
                    case 5:
                        MyList.Sort();
                        break;
                    case 6:
                        state = false;
                        break;
                }
            }
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2018, 15:33
Ответы с готовыми решениями:

Сортировка через интерфейс IComparer
Создать массив char(случайно и от руки). Отсортировать его при помощи Array.Sort так, чтобы вначале были гласные в алфавитном порядке, а...

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

Компараторы IComparable и IComparer
Добрый вечер, нужна помощь с компараторами IComparable и IComparer, а точнее нужно их реализовать в коде using System; using...

4
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16118 / 11242 / 2887
Регистрация: 21.04.2018
Сообщений: 33,051
Записей в блоге: 2
19.12.2018, 15:41
Цитата Сообщение от wersahi2 Посмотреть сообщение
Добрый день! Мне нужно отсортировать список по зарплате. Сейчас я реализовала сортировку только тогда, когда список содержит экземпляры одного потомка. Как мне сделать чтобы список сортировался, когда он содержит экземпляры двух потомков?
В базовом классе реализуйте IComparable с приведением к базовому типу.
В наследниках проверяете, если тип приводится к наследнику, сравниваете через метод наследника. Если нет, но можно привести к базовому классу, сравниваете через базовый метод.
0
1 / 1 / 0
Регистрация: 30.05.2015
Сообщений: 130
19.12.2018, 15:56  [ТС]
немного Вас не поняла
0
1524 / 515 / 126
Регистрация: 09.01.2018
Сообщений: 1,613
19.12.2018, 16:43
Так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
    public abstract class Worker : IComparable
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public abstract decimal Wage();
 
        public int CompareTo(object obj)
        {
            if (obj == null) return 1;
            return this.Wage().CompareTo(((Worker)obj).Wage());
        }
    }
Или так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
    public abstract class Worker : IComparable<Worker>
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public abstract decimal Wage();
 
        public int CompareTo(Worker other)
        {
            if (other == null) return 1;
            return this.Wage().CompareTo(other.Wage());
        }
    }
Все сортируется:

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        static void Main(string[] args)
        {
            var list = new List<Worker>();
            list.Add(new HourlyWorker { Id = 1, Name = "HWorker1", HourlyRate = 10.6m });
            list.Add(new HourlyWorker { Id = 2, Name = "HWorker2", HourlyRate = 12.8m });
            list.Add(new HourlyWorker { Id = 3, Name = "HWorker3", HourlyRate = 8.44m });
            list.Add(new HourlyWorker { Id = 4, Name = "HWorker4", HourlyRate = 7.92m });
 
            list.Add(new FixedWorker { Id = 5, Name = "FWorker5", MounthlySalary = 2900m });
            list.Add(new FixedWorker { Id = 6, Name = "FWorker6", MounthlySalary = 1750m });
            list.Add(new FixedWorker { Id = 7, Name = "FWorker7", MounthlySalary = 1245.9m });
            list.Add(new FixedWorker { Id = 8, Name = "FWorker8", MounthlySalary = 2942.1m });
 
            Console.WriteLine("Unsorted");
            DisplayCollection(list);
 
            list.Sort();
            Console.WriteLine("\nSorted");
            DisplayCollection(list);
 
            Console.ReadKey();
        }
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Unsorted
[1] - HWorker1 - $1,763.84
[2] - HWorker2 - $2,129.92
[3] - HWorker3 - $1,404.42
[4] - HWorker4 - $1,317.89
[5] - FWorker5 - $3,163.64
[6] - FWorker6 - $1,909.09
[7] - FWorker7 - $1,359.16
[8] - FWorker8 - $3,209.56
 
Sorted
[4] - HWorker4 - $1,317.89
[7] - FWorker7 - $1,359.16
[3] - HWorker3 - $1,404.42
[1] - HWorker1 - $1,763.84
[6] - FWorker6 - $1,909.09
[2] - HWorker2 - $2,129.92
[5] - FWorker5 - $3,163.64
[8] - FWorker8 - $3,209.56
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.12.2018, 16:49
Цитата Сообщение от wersahi2 Посмотреть сообщение
C#
1
2
HourlyPayment temp;
temp = (HourlyPayment)obj;
А зачем здесь вообще явное указание потомка?
Делайте переменную типа Worker и все норм.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.12.2018, 16:49
Помогаю со студенческими работами здесь

Работа с интерфейсами ICloneable, IComparable и IComparer
Помогите пожалуйста. Только пожалуйста не нужно писать о том, что тут все легко даже делать нечего. Мне нужно хотя бы примерное объяснение...

Как реализовать интерфейсы IEnumerable, IComparable, IComparer?
Интерфейсы IEnumerable, IComparable, IComparer. Как реализовать? Или у кого-то есть готовый код который соответствует данному условию....

Интерфейс IComparer
Объявляю класс реализующий интерфейс IComparer. Компилятор выдает ошибку Ошибка 1 Использование универсального тип...

Коллекции и их интерфейсы (IList, ICollection, IDictionary, IEnumerable, IComparer)
Расскажите пожалуйста какие интерфейсы зачем нужны. Если можно с примерами. Почитал MSDN - ничего не понял, в остальном пространстве...

Интерфейс IComparer для бинарного дерева
Мне нужно написать обобщенное бинарное дерево, которое кроме этого сравнивает обьекты типа Product(мой пользовательский класс) и строит...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru