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

Создать с помощью делегатов метод сортировки списка объектов класса "Товар"

17.05.2020, 08:38. Показов 6109. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не понимаю как это реализовать, помогите, пожалуйста !!
Создать с помощью делегатов метод сортировки списка объектов класса "Товар" (алгоритм сортировки может быть выбран произвольно, например, метод «пузырька»). С помощью делегатов обеспечить возможность проведения сортировки товаров по наименованию (тип string), по цене (тип double), по количеству на складе (тип double), по сроку годности (тип DateTime). Делегат должен передавать информацию о функции сравнения двух объектов класса "Товар".
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.05.2020, 08:38
Ответы с готовыми решениями:

Создать с помощью делегатов метод сортировки списка объектов некого класса
Создать с помощью делегатов метод сортировки списка объектов некого класса. С помощью делегатов сделать сортировку по string, double и...

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

Реализовать два метода сортировки массива, а также метод вывода на консоль. С помощью делегатов
Здравствуйте, начинаю изучать делегаты и события. Ни как не могу разобраться в них... Было бы отлично если бы вы помогли с этой задачей. ...

13
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
17.05.2020, 11:24
Викмп, дла начала
1) объяви класс "Товар"
2) В методе Main объяви массив или список с элементами типа "Товар" и заполни его данными
3) Напиши метод сортировки "пузырьком" по цене товара
Имея это можно будет начать разговор про делегаты
0
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 17
17.05.2020, 14:19  [ТС]
Добавлено через 1 минуту
OwenGlendower, с этим справилась, но всё равно не могу вставить делегаты
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
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace лр 
{
   class Tovar
   {
        public string name { get; set; }
        public double price { get; set; }
        public double amount { get; set; }
 
        public Tovar(string name, double price, double amount)
 
        {
            this.name = name;
            this.price = price;
            this.amount = amount;
        }
 
        public static int SortName(Tovar x, Tovar y)
        {
            int ret = x.name.CompareTo(y.name);
            if (ret != 0)
                return ret;
            return x.price.CompareTo(y.price);
        }
 
        public static int SortPrice(Tovar x, Tovar y)
        {
            int ret = x.price.CompareTo(y.price);
            if (ret != 0)
                return ret;
            return x.name.CompareTo(y.name);
        }
 
        public static int SortAmount(Tovar x, Tovar y)
        {
            int ret = x.amount.CompareTo(y.amount);
            if (ret != 0)
                return ret;
            return x.name.CompareTo(y.name);
        }
 
 
    }
 
 
    class Program
    {
        private static string name;
        private static int price;
        private static int amount;
 
        static void Main(string[] args)
       {
         List<Tovar> tovars = new List<Tovar>()
       {
        new Tovar(name="Peach", price = 12, amount = 300),
        new Tovar(name="Avocado", price = 70, amount = 150),
        new Tovar(name="Apple", price = 30, amount = 500)
       };
 
            tovars.Sort(Tovar.SortName); ///////apple, avocado, peach
            Console.WriteLine("Алфавитный список товаров:\r\n"
               + string.Join("\r\n", tovars.Select(st => st.name)));
            Console.WriteLine();
 
            tovars.Sort(Tovar.SortPrice);///////// peach, apple, avocado
            Console.WriteLine("Список товаров по цене:\r\n"
               + string.Join("\r\n", tovars.Select(st => st.name + " " + st.price + "руб")));
 
            Console.WriteLine();
 
            tovars.Sort(Tovar.SortAmount); ///////// avocado, peach, apple
            Console.WriteLine("Список товаров по количеству:\r\n"
               + string.Join("\r\n", tovars.Select(st => st.name + " " + st.amount + "шт")));
 
        }
    }
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
17.05.2020, 14:37
Викмп, тебя просят самостоятельно реализовать сортировку, а не пользоваться встроенным методом. Вообще глядя на стандартный метод Sort можно догадаться как должна выглядеть собственная реализация.

P.S. Убери static поля name, price, amount из класса Program и исправь создание списка на
C#
1
2
3
4
5
6
List<Tovar> tovars = new List<Tovar>()
{
    new Tovar("Peach", 12, 300),
    new Tovar("Avocado", 70, 150),
    new Tovar("Apple", 30, 500)
};
0
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 17
17.05.2020, 14:49  [ТС]
OwenGlendower, Исправила
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
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace лр
{
    class Tovar
    {
        public string name { get; set; }
        public double price { get; set; }
        public double amount { get; set; }
 
        public Tovar(string name, double price, double amount)
 
        {
            this.name = name;
            this.price = price;
            this.amount = amount;
        }
 
        public static int SortName(Tovar x, Tovar y)
        {
            int ret = x.name.CompareTo(y.name);
            if (ret != 0)
                return ret;
            return x.price.CompareTo(y.price);
        }
 
        public static int SortPrice(Tovar x, Tovar y)
        {
            int ret = x.price.CompareTo(y.price);
            if (ret != 0)
                return ret;
            return x.name.CompareTo(y.name);
        }
 
        public static int SortAmount(Tovar x, Tovar y)
        {
            int ret = x.amount.CompareTo(y.amount);
            if (ret != 0)
                return ret;
            return x.name.CompareTo(y.name);
        }
 
 
    }
 
 
    class Program
    {
        
        static void Main(string[] args)
        {
            List<Tovar> tovars = new List<Tovar>()
{
    new Tovar("Peach", 12, 300),
    new Tovar("Avocado", 70, 150),
    new Tovar("Apple", 30, 500)
};
 
            tovars.Sort(Tovar.SortName); ///////apple, avocado, peach
            Console.WriteLine("Алфавитный список товаров:\r\n"
               + string.Join("\r\n", tovars.Select(st => st.name)));
            Console.WriteLine();
 
            tovars.Sort(Tovar.SortPrice);///////// peach, apple, avocado
            Console.WriteLine("Список товаров по цене:\r\n"
               + string.Join("\r\n", tovars.Select(st => st.name + " " + st.price + "руб")));
 
            Console.WriteLine();
 
            tovars.Sort(Tovar.SortAmount); ///////// avocado, peach, apple
            Console.WriteLine("Список товаров по количеству:\r\n"
               + string.Join("\r\n", tovars.Select(st => st.name + " " + st.amount + "шт")));
 
        }
    }
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
17.05.2020, 15:00
Викмп, хорошо. Тепеоь напиши метод Sort в классе Program с такой сигнатурой
C#
1
2
3
static void Sort(List<Tovar> list)
{
}
который сортирует список "пузырьком" и для сравнения использует, например, имя товара.
0
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 17
17.05.2020, 17:24  [ТС]
OwenGlendower,
Не смогла сделать сортировку пузырьком с именем товара
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
17.05.2020, 17:32
Викмп, в таком случае напиши сортировку "пузырьком" для List<int>. Это простая задача. Потом переделаем её для List<Tovar>.
0
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 17
17.05.2020, 18:33  [ТС]
OwenGlendower, так?
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
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace лр
{
    class Tovar
    {
        public string name { get; set; }
        public double price { get; set; }
        public double amount { get; set; }
 
        public Tovar(string name, double price, double amount)
 
        {
            this.name = name;
            this.price = price;
            this.amount = amount;
        }
 
        public static int SortName(Tovar x, Tovar y)
        {
            int ret = x.name.CompareTo(y.name);
            if (ret != 0)
                return ret;
            return x.price.CompareTo(y.price);
        }
 
        public static int SortPrice(Tovar x, Tovar y)
        {
            int ret = x.price.CompareTo(y.price);
            if (ret != 0)
                return ret;
            return x.name.CompareTo(y.name);
        }
 
        public static int SortAmount(Tovar x, Tovar y)
        {
            int ret = x.amount.CompareTo(y.amount);
            if (ret != 0)
                return ret;
            return x.name.CompareTo(y.name);
        }
 
 
    }
 
 
    class Program
    {
 
        static void Main(string[] args)
        {
            List<Tovar> tovars = new List<Tovar>()
{
    new Tovar("Peach", 12, 300),
    new Tovar("Avocado", 70, 150),
    new Tovar("Apple", 30, 500)
};
            static void Sort(List<int> list)
            {
                int temp;
                for (int i = 0; i < list.Count; i++)
                {
                    for (int j = i + 1; j < list.Count; j++)
                    {
                        if (list[i] > list[j])
                        {
                            temp = list[i];
                            list[i] = list[j];
                            list[j] = temp;
                        }
                    }
                }
                
            }
 
            tovars.Sort(Tovar.SortName); ///////apple, avocado, peach
            Console.WriteLine("Алфавитный список товаров:\r\n"
               + string.Join("\r\n", tovars.Select(st => st.name)));
            Console.WriteLine();
 
            tovars.Sort(Tovar.SortPrice);///////// peach, apple, avocado
            Console.WriteLine("Список товаров по цене:\r\n"
               + string.Join("\r\n", tovars.Select(st => st.name + " " + st.price + "руб")));
 
            Console.WriteLine();
 
            tovars.Sort(Tovar.SortAmount); ///////// avocado, peach, apple
            Console.WriteLine("Список товаров по количеству:\r\n"
               + string.Join("\r\n", tovars.Select(st => st.name + " " + st.amount + "шт")));
 
        }
    }
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
17.05.2020, 18:41
Цитата Сообщение от Викмп Посмотреть сообщение
так?
Да. Только не надо было делать его локальным методом. Теперь возьем метод void Sort(List<int> list)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static void Sort(List<int> list)
{
    int temp;
    for (int i = 0; i < list.Count; i++)
    {
        for (int j = i + 1; j < list.Count; j++)
        {
            if (list[i] > list[j])
            {
                temp = list[i];
                list[i] = list[j];
                list[j] = temp;
            }
        }
    }
}
и перепишем под сортровку товаров по цене
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void SortByPrice(List<Tovar> list)
{
    for (int i = 0; i < list.Count; i++)
    {
        for (int j = i + 1; j < list.Count; j++)
        {
            if (list[i].price > list[j].price)
            {
                var temp = list[i];
                list[i] = list[j];
                list[j] = temp;
            }
        }
    }
}
И по имени
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void SortByName(List<Tovar> list)
{
    for (int i = 0; i < list.Count; i++)
    {
        for (int j = i + 1; j < list.Count; j++)
        {
            if (string.Compare(list[i].name, list[j].name) > 0)
            {
                var temp = list[i];
                list[i] = list[j];
                list[j] = temp;
            }
        }
    }
}
Чем отличаются методы SortByPrice и SortByName?
0
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 17
17.05.2020, 19:18  [ТС]
OwenGlendower, в первом случае сравнение идет между элементами, а во втором они сравниваются с нулем?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
17.05.2020, 19:27
Викмп, условием они отличаются, а остальной код остается таким же, что намекает на решение с делегатами. Мы можем создать метод принимающий делегаг Func<Tovar,Tovar,int> и получим окончательное решение
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
class Program
{
    static void Sort(List<Tovar> list, Func<Tovar,Tovar,int> comparer)
    {
        for (int i = 0; i < list.Count; i++)
        {
            for (int j = i + 1; j < list.Count; j++)
            {
                if (comparer(list[i], list[j]) > 0)
                {
                    var temp = list[i];
                    list[i] = list[j];
                    list[j] = temp;
                }
            }
        }
 
    }
 
    static void Main(string[] args)
    {
        List<Tovar> tovars = new List<Tovar>()
        {
            new Tovar("Peach", 12, 300),
            new Tovar("Avocado", 70, 150),
            new Tovar("Apple", 30, 500)
        };
 
        Sort(tovars, Tovar.SortName); ///////apple, avocado, peach
        Console.WriteLine("Алфавитный список товаров:\r\n"
           + string.Join("\r\n", tovars.Select(st => st.name)));
        Console.WriteLine();
 
        Sort(tovars, Tovar.SortPrice);///////// peach, apple, avocado
        Console.WriteLine("Список товаров по цене:\r\n"
           + string.Join("\r\n", tovars.Select(st => st.name + " " + st.price + "руб")));
 
        Console.WriteLine();
 
        Sort(tovars, Tovar.SortAmount); ///////// avocado, peach, apple
        Console.WriteLine("Список товаров по количеству:\r\n"
           + string.Join("\r\n", tovars.Select(st => st.name + " " + st.amount + "шт")));
    }
}
0
0 / 0 / 0
Регистрация: 26.02.2020
Сообщений: 17
17.05.2020, 21:45  [ТС]
OwenGlendower, то есть так полный код будет выглядеть?
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
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace лр
{
class Tovar
{
public string name { get; set; }
public double price { get; set; }
public double amount { get; set; }
 
public Tovar(string name, double price, double amount)
 
{
this.name = name;
this.price = price;
this.amount = amount;
}
 
public static int SortName(Tovar x, Tovar y)
{
int ret = x.name.CompareTo(y.name);
if (ret != 0)
return ret;
return x.price.CompareTo(y.price);
}
 
public static int SortPrice(Tovar x, Tovar y)
{
int ret = x.price.CompareTo(y.price);
if (ret != 0)
return ret;
return x.name.CompareTo(y.name);
}
 
public static int SortAmount(Tovar x, Tovar y)
{
int ret = x.amount.CompareTo(y.amount);
if (ret != 0)
return ret;
return x.name.CompareTo(y.name);
}
 
 
}
 
 
class Program
{
static void Sort(List<Tovar> list, Func<Tovar, Tovar, int> comparer)
{
for (int i = 0; i < list.Count; i++)
{
for (int j = i + 1; j < list.Count; j++)
{
if (comparer(list[i], list[j]) > 0)
{
var temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
}
 
}
 
static void Main(string[] args)
{
List<Tovar> tovars = new List<Tovar>()
{
new Tovar("Peach", 12, 300),
new Tovar("Avocado", 70, 150),
new Tovar("Apple", 30, 500)
};
 
Sort(tovars, Tovar.SortName); ///////apple, avocado, peach
Console.WriteLine("Алфавитный список товаров:\r\n"
+ string.Join("\r\n", tovars.Select(st => st.name)));
Console.WriteLine();
 
Sort(tovars, Tovar.SortPrice);///////// peach, apple, avocado
Console.WriteLine("Список товаров по цене:\r\n"
+ string.Join("\r\n", tovars.Select(st => st.name + " " + st.price + "руб")));
 
Console.WriteLine();
 
Sort(tovars, Tovar.SortAmount); ///////// avocado, peach, apple
Console.WriteLine("Список товаров по количеству:\r\n"
+ string.Join("\r\n", tovars.Select(st => st.name + " " + st.amount + "шт")));
}
}
}
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
17.05.2020, 21:59
Лучший ответ Сообщение было отмечено Викмп как решение

Решение

Викмп, да, только я бы методы сравнения изменил чтобы они сравнивали только один признак.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static int SortName(Tovar x, Tovar y)
{
    return x.name.CompareTo(y.name);
}
 
public static int SortPrice(Tovar x, Tovar y)
{
    return x.price.CompareTo(y.price);
}
 
public static int SortAmount(Tovar x, Tovar y)
{
    return x.amount.CompareTo(y.amount);
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.05.2020, 21:59
Помогаю со студенческими работами здесь

Метод половинного деления с помощью делегатов
На основе принципа функциональной параметризации создать универсальный метод решения уравнений f(x) = 0, в основе которого заложен...

Как пройтись массивом делегатов по массиву объектов класса?
Нужно по массив делегатов должен пройтись по каждому студенту. public delegate void DelegateAction(); struct Student { int...

Передать метод как параметр в конструктор с помощью делегатов
Необходимо передать функцию как параметр в конструктор. Я прочитал про делегаты и описал его: using System; using...

Изучение возможности инициализации объектов класса с помощью конструкторов и уничтожение их с помощью деструкторов
Помогите пожалуйста с помощью класса функций,если не трудно и с объяснением Цели: Изучение возможности инициализации объектов класса с...

как создать для класса метод, который при вызове удаляет из заданного списка все указанные элементы
вот задание: Дан класс class List: Необходимо создать для него метод, который при вызове удаляет из заданного списка все указанные...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[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-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru