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

Сортировка массива по одному из полей внутренних обьектов

12.10.2015, 14:11. Показов 1120. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Классы:
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
abstract class Worker
    {
        public Worker(string Name)
        {
            Id = ++Id;
            this.Name = Name;
        }
 
        public static uint Id { get; set; }
        public string Name { get; set; }
        public abstract double Salary { get; }
 
        public override string ToString()
        {
            return $"Worker #{Id}. Name: {Name}. Salary: {Salary}";
        }
    }
    class FixedWorker: Worker
    {
        public FixedWorker(string Name) :base(Name) { }
        public FixedWorker(string Name, double HourlyRate) :base(Name)
        {
            this.HourlyRate = HourlyRate;
        }
 
        public double HourlyRate { get; set; } = 90;
        public override double Salary { get { return 20.8 * 8 * HourlyRate; } }
    }
    class HourlyWorker : Worker
    {
        public HourlyWorker(string Name) : base(Name) { }
        public HourlyWorker(string Name, double MonthlyRate) : base(Name)
        {
            this.MonthlyRate = MonthlyRate;
        }
 
        public double MonthlyRate { get; set; } = 10900;
        public override double Salary { get { return MonthlyRate; } }
    }

Есть массив:
C#
1
2
3
4
5
6
7
8
9
10
11
12
Worker[] workers = new Worker[] {
                new FixedWorker("Mikkey"),
                new FixedWorker("John", 87),
                new FixedWorker("Mak", 45),
                new FixedWorker("Sergiy", 50),
                new FixedWorker("Vitaly", 2),
                new HourlyWorker("Maki", 2000),
                new HourlyWorker("Andriy", 2300),
                new HourlyWorker("Batia", 9999),
                new HourlyWorker("Ievdokum", 1500),
                new HourlyWorker("Iaropolk", 1000),
            };
Нужно отсортировать по убыванию Salary, и, если имена совпадают, сортировать их по алфавиту. Уверен, что можна через Array.Sort() отсортировать, но голову сломи не могу додуматся. Не представляю как сделать(


P.S. есть еще маленький баг. Все елементы должны иметь уникальные Id, но у меня не выходит наладить их.

Добавлено через 3 минуты
Нашёл вот такой код:
C#
1
Array.Sort(workers, (p1, p2) => p1.Salary < p2.Salary));
Но видимо он неправильно написан
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.10.2015, 14:11
Ответы с готовыми решениями:

Сортировка массива обьектов по одному из полей
Есть коллекция обьектов. public class Book { private string author { get; set; } private string name {...

Сортировка классов по одному из полей
есть List&lt;Employee&gt; у работника есть фамилия и имя. Нужно выполнить сортировку по фамилии и, если фамилии совпадают, то по имени еще. ...

Фильтрация массива коллекций по одному из полей
Здравствуйте. Имеем: коллекцию - List&lt;Obj&gt; manyObjs;массив - string manyStrs; Задача: произвести фильтрацию (в коде наглядно) ...

6
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.10.2015, 14:35
Цитата Сообщение от Candy_Ogre Посмотреть сообщение
Нужно отсортировать по убыванию Salary, и, если имена совпадают, сортировать их по алфавиту.
Вот этот момент разверните, пожалуйста.
Если имена совпадают, то они будут отсортированы по алфавиту в любом случае.

Цитата Сообщение от Candy_Ogre Посмотреть сообщение
Все елементы должны иметь уникальные Id
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
abstract class Worker
    {
        protected static uint LastId;
 
        public Worker(string Name)
        {
            Id = Interlocked.Increment(ref LastId);
            this.Name = Name;
        }
 
        public uint Id { get; set; }
        public string Name { get; set; }
        public abstract decimal Salary { get; }
 
        public override string ToString()
        {
            return $"Worker #{Id}. Name: {Name}. Salary: {Salary}";
        }
    }
Заодно исправил тип Salary с double на decimal.
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 19
12.10.2015, 14:48  [ТС]
Сортировал таким способом:
C#
1
var t = workers.OrderBy(a => a.Salary).ThenBy(b => b.Name);
Добавлено через 3 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Id = Interlocked.Increment(ref LastId);
Ругается что не может конвертировать ref uint в ref int. Странно

UPD: Попробовал сменить uint везде на int. Заметил что Id всеравно устанавливается неправильно. Хм. system.threading подключал, ошибок не показывает...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.10.2015, 14:52
Цитата Сообщение от Candy_Ogre Посмотреть сообщение
Сортировал таким способом
Годится, только учтите, что этот метод возвращает лишь представление массива.
Сам массив при этом не изменяется.

Цитата Сообщение от Candy_Ogre Посмотреть сообщение
Id всеравно устанавливается неправильно.
А как он должен устанавливаться правильно?
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 19
12.10.2015, 17:23  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Годится, только учтите, что этот метод возвращает лишь представление массива.
Ага, уже понял. Приводил IOrderedEnumerable до Array:
C#
1
workers = workers.OrderByDescending(a => a.Salary).ThenBy(b => b.Name).ToArray();
Цитата Сообщение от kolorotur Посмотреть сообщение
А как он должен устанавливаться правильно?
Эта строка вызывает ошибку:
C#
1
Id = Interlocked.Increment(ref LastId);
error CS1503: Argument 1: cannot convert from 'ref uint' to 'ref int'

Метод Increment возвращает int. Вот и ошибка. Если же я все переменные делаю int, все Id становятся 10.

Добавлено через 6 минут
Скриншот: https://www.dropbox.com/s/9lu3... A.png?dl=0

Добавлено через 3 минуты
сделал!!! id нужно было сделать обычным, не static.

Еще вопрос. Последний. А как лучше организовать чтение из файла и запись в файл коллекции? Как лучше сделать, я не знаю(
Вот весь код:

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
using System;
using System.Linq;
using System.Threading;
 
namespace hard
{
    class Program
    {
        static void Main(string[] args)
        {
            Worker[] workers = new Worker[] {
                new FixedWorker("Mikkey"),
                new FixedWorker("John", 87),
                new FixedWorker("Mak", 45),
                new FixedWorker("Sergiy", 50),
                new FixedWorker("Vitaly", 2),
                new HourlyWorker("Maki", 2000),
                new HourlyWorker("Andriy", 2300),
                new HourlyWorker("Batia", 9999),
                new HourlyWorker("Ievdokum", 1500),
                new HourlyWorker("Iaropolk", 1000),
            };
 
            // linq expression
            //This is a short working code, but if the array is large, it is not very efficient (in performance term), because the array is converted to list first, then sorted, and finally converted to array
            workers = workers.OrderByDescending(a => a.Salary).ThenBy(b => b.Name).ToArray();
            //Array.Sort(workers);
            //Array.Reverse(workers);
            foreach (var worker in workers)
            {
                Console.WriteLine(worker.ToString());
            }
 
            Console.WriteLine(Environment.NewLine + "First 5 names: ");
            for(int i = 0; i < 5; i++)
            {
                Console.WriteLine($"#{i+1}: {workers[i].Name}");
            }
                
            Console.ReadKey();
        }
    }
    abstract class Worker :IComparable<Worker>
    {
        protected static int LastId;
 
        public Worker(string Name)
        {
            Id = Interlocked.Increment(ref LastId);
            this.Name = Name;
        }
 
        public int Id { get; set; }
        public string Name { get; set; }
        public abstract double Salary { get; }
 
        public override string ToString()
        {
            return $"Worker #{Id}. Name: {Name}. Salary: {Salary}";
        }
        public int CompareTo(Worker other)
        {
            int result = Salary.CompareTo(other.Salary);
            return result != 0 ? result : Name.CompareTo(other.Name);
        }
    }
    class FixedWorker: Worker
    {
        public FixedWorker(string Name) :base(Name) { }
        public FixedWorker(string Name, double HourlyRate) :base(Name)
        {
            this.HourlyRate = HourlyRate;
        }
 
        public double HourlyRate { get; set; } = 90;
        public override double Salary { get { return 20.8 * 8 * HourlyRate; } }
    }
    class HourlyWorker : Worker
    {
        public HourlyWorker(string Name) : base(Name) { }
        public HourlyWorker(string Name, double MonthlyRate) : base(Name)
        {
            this.MonthlyRate = MonthlyRate;
        }
 
        public double MonthlyRate { get; set; } = 10900;
        public override double Salary { get { return MonthlyRate; } }
    }
}
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.10.2015, 17:53
Цитата Сообщение от Candy_Ogre Посмотреть сообщение
id нужно было сделать обычным, не static.
Так в предложенном мной коде это же исправлено.

Цитата Сообщение от Candy_Ogre Посмотреть сообщение
как лучше организовать чтение из файла и запись в файл коллекции?
Смотря в каком виде данные хранятся в файле.
0
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 19
12.10.2015, 19:10  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Так в предложенном мной коде это же исправлено.
Недосмотрел(
Цитата Сообщение от kolorotur Посмотреть сообщение
Смотря в каком виде данные хранятся в файле.
В том то и суть. Выбор свободный. Писать в самый обычный txt. Просто как хранить там коллекцию і как потом ее считать в программу я не знаю

Добавлено через 48 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
Смотря в каком виде данные хранятся в файле.
Нашёл, что можно всё это дело сериализировать. Но как, не разберусь никак. Да и как читать тот файл потом...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.10.2015, 19:10
Помогаю со студенческими работами здесь

Сортировка массива структур по одному из полей
Привет всем! У меня такая загвоздка возникла... Есть вот такой массив: Structure ListArray Dim Name As String ...

Сортировка многомерного массива по одному из полей
Есть массив такого вида Array ( =&gt; Array ( =&gt; 4970 =&gt; 4970 =&gt;...

Сортировка массива объектов по одному из полей
У меня есть массив объектов. В каждом объекте есть поле 'count' и нужно отсортировать этот массив по убиванию этих полей.

Сортировка массива структур по одному из полей
Задание 1.Описать структуру с именем STUDENT, содержащую следующие поля: • NAME – фамилия и инициалы; • GROUP – номер группы; •...

Сортировка массива структур по одному из полей
Есть структура: struct Book { char name; char author; char publisher; int pages; } И массив структур: const int size =...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru