Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/145: Рейтинг темы: голосов - 145, средняя оценка - 4.55
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913

Написать свой List<T>

08.11.2011, 17:12. Показов 30522. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как создать собственный класс списка? Т.е. вот есть список List<T>,
если пишу
C#
1
List<string> l = new List<string>()
, то создается стринговый список, если так
C#
1
List<int> l = new List<int>()
, то int
А мне надо класс, в который потом могу подставить что угодно. Спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2011, 17:12
Ответы с готовыми решениями:

Как написать метод List<T> ToList(DoubleList<T> list)?
Нужно преобразовать двунаправленный список к однонаправленному. Я знаю чем они отличаются, как работать с данными (добавлять, удалять), но...

Перенос данных из массива `свой класс` в List<string>
Хочу перенести все данные из массива своего класса который имеет несколько но надо переместить конкретную переменную в List&lt;string&gt;....

Поднял свой Dns Вlack List сервер
Поднял свой DNS Вlack List сервер для R7.0.2. Пока доволен. Какие детали кого интересуют? Готов помочь!

15
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.11.2011, 17:14
C#
1
2
3
4
5
6
7
8
9
public class MyClass<T>
{
   public T Value { get; set; }
 
   public MyClass(T defaultValue)
   {
      Value = defaultValue;
   }
}
Использование:
C#
1
2
3
4
5
MyClass<string> strClass = new MyClass<string>("Hello world!");
Console.WriteLine(strClass.Value); // Hello world!
 
MyClass<int> intClass = new MyClass<int>(42);
Console.WriteLine(intClass.Value); // 42
0
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
08.11.2011, 17:21  [ТС]
kolorotur, спасибо, а если мне надо , чтобы Т было списком List, чтобы я могла добавлять в него элемент, удалять и прочее?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.11.2011, 17:26
Не совсем понимаю: вам надо было чтобы тип Value мог быть списком, или вам надо написать свою реализацию списка?
0
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
08.11.2011, 17:28  [ТС]
Да, именно своя реализяция списка!!!
0
45 / 47 / 4
Регистрация: 11.02.2010
Сообщений: 376
08.11.2011, 17:32
Цитата Сообщение от iva_a Посмотреть сообщение
Да, именно своя реализяция списка!!!
Ну эт надо структуры и алгоритмы обработки данных вспомнить. Там усе уесть). Ну и подсмотреть у Шиллдта, к примеру, что такое обобщения)
Где-то здесь на форуме есть реализация списка. а там уже вставляй свои значения, какие тебе надо, но сам LIst не переплюнешь все равно. Надеюсь, я правильно понял, что хочешь()))
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.11.2011, 17:33
C#
1
2
3
4
public class MyList<T>
{
   private T[] list; // Здесь будут храниться все элементы
}
И дальше уже дописывайте методы для добавления/удаления, открытые свойства, конструкторы и прочие прелести. Внутри этих методов работайте с закрытым массивом list
1
168 / 140 / 23
Регистрация: 02.01.2011
Сообщений: 913
08.11.2011, 17:54  [ТС]
В том-то и дело, что мне не хочется переписывать List, хотелось бы как-то использовать существующую конструкцию, но с generic,т.е. с <T>
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
08.11.2011, 17:57
То есть сделать обертку над классом System.Collections.Generic.List<T>?
0
 Аватар для Masia_March
70 / 70 / 12
Регистрация: 09.08.2011
Сообщений: 116
Записей в блоге: 1
08.11.2011, 18:12
C#
1
2
3
4
5
public class UniPingDataTable // класс хранения данных 
    {
        public List<string> AllOids { get; set; } // храню список OID
        public List<UnipingDataBase> PreviousList { get; set; }// храню все текущее состояния устройства
    }
0
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
08.11.2011, 18:50
Цитата Сообщение от iva_a Посмотреть сообщение
В том-то и дело, что мне не хочется переписывать List, хотелось бы как-то использовать существующую конструкцию, но с generic,т.е. с <T>
- хочу сделать такое же, но переписывать не хочу, но чтоб такое же было, но не такое как первое

А обычный List<T> типа не generic чтоль? В нем <T> нету?))
2
Заблокирован
24.12.2015, 13:46
Цитата Сообщение от viktorrrr Посмотреть сообщение
Ну эт надо структуры и алгоритмы обработки данных вспомнить. Там усе уесть). Ну и подсмотреть у Шиллдта, к примеру, что такое обобщения)
Где-то здесь на форуме есть реализация списка. а там уже вставляй свои значения, какие тебе надо, но сам LIst не переплюнешь все равно. Надеюсь, я правильно понял, что хочешь()))
как известно в C# названия списков перевраны, List - не является списком в смысле структуры данных, это всего лишь динамический массив, а список в C# - LinkedList
0
2 / 2 / 1
Регистрация: 04.01.2018
Сообщений: 24
27.08.2018, 23:02
Я конешн поздно, но может другим помогу)

Почему нельзя
C#
1
List<AnyClass> lsi = new List<AnyClass>();
?
А в AnyClass можно запихнуть все что угодно или за место AnyClass можно создать структуру или интерфейс. Да хоть обобщеный:
C#
1
List<AnyClass<int>> lsi = new List<AnyClass<int>>();
Да хоть еще обобщенее:
C#
1
List<AnyClass<IEnumerable<int>>> lsi = new List<AnyClass<IEnumerable<int>>>();
Для того чтобы запихнуть туда что угодно, ничего не требуется. Просто запихните. Оно сожрет все.
(Для доступа к членам класса или интерфейса нужно создать экземпляр этого класса или экземпляр того класса(конкретного), который реализует этот интерфейс).

Свои листы создаются для инкапсуляции, например, базы данных.
Для реализации своего листа нужно реализовать System.Collections.Generic.IList<YourTyp e>, но для того чтоб все как у List, нужно реализовать еще и: ICollection, IReadOnlyList<YourType>, IReadOnlyCollection<YourType>.

Добавлено через 9 минут
Под словом "запихнуть все-все" я подразумеваю правильную работу кода ниже
C#
1
List<dynamic> gf = new List<dynamic>();
0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
28.08.2018, 13:05
iva_a, давно писал:
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;
 
namespace MyCollections.Generic
{
  //Список на базе динамического массива.
  public class List<T> : IPrintable, ICloneableAs<List<T>>
  {
        private T[] source;
 
    private void ThrowIfInvalid(int index)
    {
      if ((index < 0) || (index >= Count))
      {
        throw new IndexOutOfRangeException(nameof(index));
      }
    }
 
        private void TryResize()
        {
            Count++;
            if (source.Length < Count)
            {
                Array.Resize(ref source, source.Length == 0 ? 1 : source.Length * 2);
            }
        }
 
    private void Insert(int index, T x)
    {
      TryResize();
            for(var i = Count - 1; i > index; i--)
            {
                source[i] = source[i - 1];
            }
      source[index] = x;
    }
 
    public T this[int i]
    {
      get
      {
        ThrowIfInvalid(i);
        return source[i];
      }
      set
      {
        ThrowIfInvalid(i);
        source[i] = value;
      }
    }
 
    public int Capacity => source.Length;
    public int Count { get; private set; }
 
    public List()
    {
      source = new T[1];
    }
 
        public string GetStringRepresentation()
        {
            string representation = "[";
            for(var i = 0; i < Count; i++)
            {
                representation += source[i].ToString();
                if (i < Count - 1)
                {
                    representation += ", ";
                }
            }
            representation += "]";
            return representation;
        }
 
        public void Print() => Console.Write(GetStringRepresentation());
 
        public void Println() => Console.WriteLine(GetStringRepresentation());
 
        public List<T> CloneAs()
        {
            List<T> list = new List<T>();
            for(var i = 0; i < Count; i++)
            {
                list.AddLast(source[i]);
            }
            return list;
        }
 
        public object Clone() => CloneAs();
 
    public void TrimExcess() => Array.Resize(ref source, Count);
 
    public int IndexOf(T x)
    {
      int i = 0;
      while ((i < Count) && (!source[i].Equals(x)))
      {
        i++;
      }
      if (i == Count)
      {
        return -1;
      }
      return i;
    }
 
    public void InsertAt(int index, T x)
    {
      ThrowIfInvalid(index);
      Insert(index, x);
    }
 
    public void RemoveAt(int index)
    {
      ThrowIfInvalid(index);
            for(var i = index; i < Count - 1; i++)
            {
                source[i] = source[i + 1];
            }
      source[Count - 1] = default(T);
      Count--;
    }
 
    public void AddFirst(T x) => Insert(0, x);
 
    public void AddLast(T x) => Insert(Count, x);
 
    public void AddBefore(T target, T x) => InsertAt(IndexOf(target) - 1, x);
 
    public void Add(T target, T x) => InsertAt(IndexOf(target), x);
 
    public void AddAfter(T target, T x) => InsertAt(IndexOf(target) + 1, x);
 
    public void RemoveFirst() => RemoveAt(0);
 
    public void RemoveLast() => RemoveAt(Count - 1);
 
    public void RemoveBefore(T x) => RemoveAt(IndexOf(x) - 1);
 
    public void Remove(T x) => RemoveAt(IndexOf(x));
 
    public void RemoveAfter(T x) => RemoveAt(IndexOf(x) + 1);
  }
}
C#
1
2
3
4
5
6
7
8
9
using System;
 
namespace MyCollections
{
    public interface ICloneableAs<T> : ICloneable
    {
        T CloneAs();
    }
}
C#
1
2
3
4
5
6
7
8
9
namespace MyCollections
{
    public interface IPrintable
    {
        string GetStringRepresentation();
        void Print();
        void Println();
    }
}
Вставилось, конечно, кривовато. В общем, думаю это Вам поможет.
0
28.08.2018, 17:49

Не по теме:


Ну наконец-то! 7 лет человек ждал.:D

0
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22
28.08.2018, 18:07
Toros1992, , человек очень терпеливый.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.08.2018, 18:07
Помогаю со студенческими работами здесь

Конвертировать один элемент из List<List<Class>> в list и string
Как можно перевести один выбранный элемент из List&lt;List&lt;Data&gt;&gt; myList в list и string? Например, myList. Сейчас я могу с помощью...

Linq преобразование List<List<double>> в List<Array>
Доброго времени суток, данный код нужно преобразовать linq выражениями и дописать выборку из List&lt;List&lt;double&gt;&gt;. Таким...

Написать свой Shell
Всем доброго времени суток, недавно я получил интересную, но не простую задачу- реализовать свой компактный но рабочий сшел (команды только...

Написать свой шаблон
Всем привет) Ребят, в общем вопрос следующий: куплен хостинг и домен, то есть по сути есть место для сайта, туда вкрутила cms WordPress,...

Написать свой движок
Всем привет !! Появилась такая идейка написать свой CMS не могли бы подсказать что для этого надо изучить и знать , пока я знаю HTML CSS...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
[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