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

Реализовать класс GenericsSet (Интерфейсы. Универсальные шаблоны)

07.05.2022, 09:32. Показов 3457. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Реализовать класс GenericsSet представляющий двусвязный список уникальных элементов, реализующих интерфейс IEquatable<T>. Реализовать метод Add, добавляющий уникальный элемент, а также методы получения n-го (Get) элемента. Реализовать свойство, возвращающее общее число элементов в списке.


Примечание от модератора:
Итоговое Решение выложено здесь: пост #52.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.05.2022, 09:32
Ответы с готовыми решениями:

Универсальные шаблоны
Создайте класс MyList&lt;T&gt;. Реализуйте в простейшем приближении возможность использования его экземпляра аналогично экземпляру класса...

Универсальные шаблоны
Не могу понять задание) Помогите разобраться, чего они хотят) Создайте класс MyClass&lt;T&gt;, содержащий статический фабричный метод...

Универсальные шаблоны
Добрый день, вопрос касательно универсальных шаблонов, типов. Как мне внутри моего универсального шаблона указать, что T - является...

51
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
11.05.2022, 21:43
Лучший ответ Сообщение было отмечено Fric как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fric Посмотреть сообщение
полный текст задания.
Если ничего не пропустил:

Файл Node.cs:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#nullable disable
 
namespace Core2022
{
    public partial class GenericsSet<T>
    {
        private class Node
        {
            public T Data;
            public Node Next;
            public Node Previous;
        }
    }
}
Файл GenericsSet.cs:
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
#nullable disable
 
namespace Core2022
{
    public partial class GenericsSet<T>
    {
        private readonly Node head = new Node();
        private readonly Node tail = new Node();
 
        public GenericsSet()
        {
            Clear();
        }
        public void Clear()
        {
            head.Next = tail;
            tail.Previous = head;
            Count = 0;
        }
 
        public int Count { get; private set; }
 
        private bool Insert(T data, Node next)
        {
            if (data == null)
                throw  new ArgumentNullException(nameof(data));
 
            if (Contains(data))
                return false;
 
            Node node = new Node();
            node.Data = data;
            node.Previous = next.Previous;
            node.Previous.Next = node;
            node.Next = next;
            node.Next.Previous = node;
 
            Count++;
 
            return true;
        }
 
        public bool Append(T data)
        {
            return Insert(data, tail);
        }
        public bool Prepend(T data)
        {
            return Insert(data, head.Next);
        }
    }
}
Файл GenericsSet.IEnumerable.cs:
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
using System.Collections;
#nullable disable
 
namespace Core2022
{
    public partial class GenericsSet<T> : IEnumerable<T>
    {
        public IEnumerator<T> GetEnumerator()
        {
            Node current = head.Next;
            while (current != tail)
            {
                yield return current.Data;
                current = current.Next;
            }
        }
 
        IEnumerator IEnumerable.GetEnumerator()
            => GetEnumerator();
 
        public IEnumerator<T> GetBackEnumerator()
        {
            Node current = tail.Previous;
            while (current != head)
            {
                yield return current.Data;
                current = current.Previous;
            }
        }
 
    }
}
Файл GenericsSet.IEquatable.cs
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
#nullable disable
 
namespace Core2022
{
    public partial class GenericsSet<T> where T : IEquatable<T>
    {
        public bool Contains(T data)
        {
            if (data == null)
                throw  new ArgumentNullException(nameof(data));
 
            foreach (var item in this)
            {
                if (data.Equals(item))
                    return true;
            }
            return false;
        }
 
        public T Get(int index)
        {
            if (index < 0 || index >= Count)
                throw new IndexOutOfRangeException();
 
            foreach (var item in this)
            {
                if (index == 0)
                    return item;
                index--;
            }
            throw new IndexOutOfRangeException();
        }
 
    }
}
1
1 / 1 / 0
Регистрация: 11.11.2020
Сообщений: 132
11.05.2022, 21:56  [ТС]
Элд Хасп, выдает ошибку
Миниатюры
Реализовать класс GenericsSet (Интерфейсы. Универсальные шаблоны)  
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,758
Записей в блоге: 3
11.05.2022, 22:02
Цитата Сообщение от Fric Посмотреть сообщение
выдает ошибку
Вам показали классы, которые нужно не запускать, а использовать в методе Main.
0
1 / 1 / 0
Регистрация: 11.11.2020
Сообщений: 132
11.05.2022, 22:07  [ТС]
И как их использовать? Нужно их вызывать в Main?
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,758
Записей в блоге: 3
11.05.2022, 22:09
Цитата Сообщение от Fric Посмотреть сообщение
Нужно их вызывать в Main?
Ну конечно. Создать список на основе классов и использовать...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
11.05.2022, 22:12
Цитата Сообщение от Fric Посмотреть сообщение
Нужно их вызывать в Main?
Пример тестового кода (для Main) есть в пост #4.
0
1 / 1 / 0
Регистрация: 11.11.2020
Сообщений: 132
11.05.2022, 22:18  [ТС]
Подскажите пожалуйста, как это должно выглядеть.

Добавлено через 5 минут
Не очень пойму, как вывести
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,758
Записей в блоге: 3
11.05.2022, 22:32
Элд Хасп,
на счет метода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public T Get(int index)
        {
            if (index < 0 || index >= Count)
                throw new IndexOutOfRangeException();
 
            int i = 0;
            foreach (var item in this)
            {
                if (i == index)
                    return item;
            }
            throw new IndexOutOfRangeException();
        }
не уверен...

Добавлено через 3 минуты
C#
1
i++;
забыли )
1
1 / 1 / 0
Регистрация: 11.11.2020
Сообщений: 132
11.05.2022, 22:32  [ТС]
Подскажите как сделать список для данных классов.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,758
Записей в блоге: 3
11.05.2022, 22:33
Fric,
Полный код:
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
using System;
using System.Collections.Generic;
using System.Collections;
 
namespace ConsoleApp1
{
    static class Program
    {
        static void Main()
        {
            GenericsSet<string> setOfStrings = new GenericsSet<string>();
            setOfStrings.Append( "aaa" );
            Console.WriteLine( setOfStrings.Count ); // 1
 
            setOfStrings.Append( "bbb" );
            setOfStrings.Append( "ccc" );
            Console.WriteLine( setOfStrings.Count ); // 3
 
            setOfStrings.Append( "bbb" ); // Мы уже добавили такой элемент раньше! Он не должен добавиться повторно
            Console.WriteLine( setOfStrings.Count ); // 3
 
            // Получаем третий элемент
            Console.WriteLine( setOfStrings.Get( 2 ) ); // ccc
 
            Console.ReadKey();
        }
 
        public partial class GenericsSet<T>
        {
            private class Node
            {
                public T Data;
                public Node Next;
                public Node Previous;
            }
        }
 
        public partial class GenericsSet<T>
        {
            private readonly Node head = new Node();
            private readonly Node tail = new Node();
 
            public GenericsSet()
            {
                Clear();
            }
            public void Clear()
            {
                head.Next = tail;
                tail.Previous = head;
                Count = 0;
            }
 
            public int Count { get; private set; }
 
            private bool Insert( T data, Node next )
            {
                if ( data == null )
                    throw new ArgumentNullException( nameof( data ) );
 
                if ( Contains( data ) )
                    return false;
 
                Node node = new Node();
                node.Data = data;
                node.Previous = next.Previous;
                node.Previous.Next = node;
                node.Next = next;
                node.Next.Previous = node;
 
                Count++;
 
                return true;
            }
 
            public bool Append( T data )
            {
                return Insert( data, tail );
            }
            public bool Prepend( T data )
            {
                return Insert( data, head.Next );
            }
        }
 
        public partial class GenericsSet<T> : IEnumerable<T>
        {
            public IEnumerator<T> GetEnumerator()
            {
                Node current = head.Next;
                while ( current != tail )
                {
                    yield return current.Data;
                    current = current.Next;
                }
            }
 
            IEnumerator IEnumerable.GetEnumerator()
                => GetEnumerator();
 
            public IEnumerator<T> GetBackEnumerator()
            {
                Node current = tail.Previous;
                while ( current != head )
                {
                    yield return current.Data;
                    current = current.Previous;
                }
            }
        }
 
        public partial class GenericsSet<T> where T : IEquatable<T>
        {
            public bool Contains( T data )
            {
                if ( data == null )
                    throw new ArgumentNullException( nameof( data ) );
 
                foreach ( var item in this )
                {
                    if ( data.Equals( item ) )
                        return true;
                }
                return false;
            }
 
            public T Get( int index )
            {
                if ( index < 0 || index >= Count )
                    throw new IndexOutOfRangeException();
 
                int i = 0;
                foreach ( var item in this )
                {
                    if ( i == index )
                        return item;
                    i++;
                }
                throw new IndexOutOfRangeException();
            }
        }
    }
}
Добавлено через 22 секунды
Вместе с примером из поста #4
0
1 / 1 / 0
Регистрация: 11.11.2020
Сообщений: 132
11.05.2022, 22:48  [ТС]
Что-то не получается

Добавлено через 2 минуты
Элд Хасп, Подскажите как реализовать Main
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,758
Записей в блоге: 3
11.05.2022, 22:55
Цитата Сообщение от Fric Посмотреть сообщение
Что-то не получается
Бросай это дело. Иди в дворники.
0
1 / 1 / 0
Регистрация: 11.11.2020
Сообщений: 132
11.05.2022, 22:57  [ТС]
wizard41, я же не профессиональный программист, а всего лишь начинающий
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3465 / 2785 / 576
Регистрация: 04.09.2018
Сообщений: 8,758
Записей в блоге: 3
11.05.2022, 23:09
Цитата Сообщение от Fric Посмотреть сообщение
всего лишь начинающий
Для начинающего слишком сложное задание.
После этого поста стало ясно что вы полный 0.
После этого - отмелись все сомнения.
Я вам дал полный рабочий код, состоящий из приведенных здесь примеров. Если вы не в состоянии его даже запустить, то начните с самых азов, например - как работать в студии, что такое консоль и т.п.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
12.05.2022, 00:41
Цитата Сообщение от wizard41 Посмотреть сообщение
забыли )
Точно!

Добавлено через 31 минуту
wizard41, Fric, исправил код метода T Get(int) в пост #21.

Добавлено через 34 секунды
C#
20
21
22
23
24
25
26
27
28
29
30
31
32
        public T Get(int index)
        {
            if (index < 0 || index >= Count)
                throw new IndexOutOfRangeException();
 
            foreach (var item in this)
            {
                if (index == 0)
                    return item;
                index--;
            }
            throw new IndexOutOfRangeException();
        }
0
1 / 1 / 0
Регистрация: 11.11.2020
Сообщений: 132
12.05.2022, 10:54  [ТС]
Элд Хасп, wizard41, а вот если необходимо реализовать рандомные числа, и чтоб из ник шла перебока уникальных элементов, есть код не пойму как исправить.
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace Core2022
{
    class GenericsSet
    {
        static void Main()
        {
            GenericsSet<double> SortedLinkedList = new();
 
            for (int i = 0; i < 20; i++)
            {
                Random rnd = new();
                double value = rnd.Next(-5, 5);
                SortedLinkedList.Add(value);
            }
 
            foreach (var item in SortedLinkedList)
            {
                Console.WriteLine(item);
            }
 
            Console.WriteLine($"Произвольный элемент в списке: {SortedLinkedList.Get(5)}");
            Console.WriteLine($"Количество элементов в списке: {SortedLinkedList.Count}");
        }
    }
}
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
12.05.2022, 12:56
Fric, во-первых, метод Main должен быть не в классе GenericsSet, а в отдельном классе - обычно в program.

Во-вторых, "числа" целые или дробные?
А то у вас SortedLinkedList объявлен для дробных, а записываете в него целые.

В-третьих, экземпляр Random должен создаваться только один раз.

В-четвёртых, если используете мою реализацию, то добавление элемента в конец списка - метод Append, в начало - Prepend.

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Console;
 
namespace Core2022
{
    class Program
    {
        static readonly Random rnd = new();
        static void Main()
        {
            GenericsSet<int> set = new();
 
            for (int i = 0; i < 20; i++)
            {
                set.Append(rnd.Next(-5, 5));
            }
 
 
            while(true)
            {
                WriteLine(string.Join(", ", set));
 
                Write("Введите целое число для добавления (пустая строка - выход): ");
                string input = ReadLine();
 
                if(string.IsNullOrWhiteSpace(input))
                   break;
 
                if(int.TryParse(input, out int num))
                {
                    if (set.Append(num))
                        WriteLine($"Число {num} добавлено в множество.");
                    else
                        WriteLine($"Число {num} не добавлено в множество.");
                }
                else
                     WriteLine("Ошибка ввода! Повторите!");
           }
 
            WriteLine("Для выхода из программы нажмите Enter -> ");
            ReadLine();
        }
    }
}
0
1 / 1 / 0
Регистрация: 11.11.2020
Сообщений: 132
12.05.2022, 13:40  [ТС]
Элд Хасп, ещё не реализован вывод общего количества элементов

Добавлено через 1 минуту
Элд Хасп, и получение уникального элемента
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
12.05.2022, 13:44
Цитата Сообщение от Fric Посмотреть сообщение
и получение уникального элемента
Добавьте запрос номера элемента и его получение методoм Get.

Цитата Сообщение от Fric Посмотреть сообщение
ещё не реализован вывод общего количества элементов
Выводите значение свойства Count.
0
1 / 1 / 0
Регистрация: 11.11.2020
Сообщений: 132
12.05.2022, 13:45  [ТС]
Элд Хасп, то есть он должен после добавления элементов выбирать какой элемент хочет вывести и посчитать общее количество элементов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.05.2022, 13:45

Универсальные шаблоны
Вот мой класс для представления граф, нужно переделать его с использование дженериков. Поясните, как это using System; using...

Универсальные шаблоны
Как исправить такую ошибку? Error 17 Operator '-' cannot be applied to operands of type 'T' and 'T' public bool...

Универсальные шаблоны
Что-то я совсем запутался)Объясните пожалуйста) Создайте класс CarCollection&lt;T&gt;. Реализуйте в простейшем приближении возможность ...

Универсальные шаблоны(сравнение)
Доброго вечера. Необходимо реализовать метод нахождения максимального и минимального элемента в структуре дека(deque). Класс реализован, а...

Для чего нужны универсальные интерфейсы типа IComparable<T>
Здравуствуйте объясните пожалуйста нормальным языком для чего нужны такие интерфейсы ??? То что в msdn написано вот тут...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru