Реализация моей собственной универсальной коллекции на C#

Я пытаюсь написать свою собственную общую коллекцию (List<T>) на С#, но запутался с интерфейсами. Насколько я понимаю, чтобы создать свою коллекцию, мне нужно реализовать несколько интерфейсов, таких как ICollection, IList, IEnumerator, IEnumerable и т. д. Но я не могу понять, какие именно мне нужны. заранее спасибо


person Oleg Ivanytskyi    schedule 06.03.2019    source источник
comment
Зависит от того, что вы хотите сделать с коллекцией. Добавление предметов? Удаление элементов? Идет поиск? Доступ на основе индекса? Заказ? ... Но велика вероятность, что вам не нужен собственный тип коллекции, так как существующих должно быть достаточно. Или это просто упражнение?   -  person HimBromBeere    schedule 06.03.2019
comment
Но я не могу понять, какие из них мне нужны. какие интерфейсы вы собираетесь использовать?   -  person phuzi    schedule 06.03.2019
comment
Я бы тоже не стал использовать List<T>, так как его можно легко спутать с версией, которая уже есть в .Net.   -  person phuzi    schedule 06.03.2019
comment
Вам нужно только реализовать IList‹T›... если вы это сделаете, вы уже выполнили ICollection‹T›, IEnumerable‹T› и IEnumerable.   -  person MineR    schedule 06.03.2019
comment
Это моя домашняя работа, создать свою родовую коллекцию)   -  person Oleg Ivanytskyi    schedule 06.03.2019
comment
На самом деле вам не нужно реализовывать какой-либо интерфейс. Так что именно вы хотите сделать со своей коллекцией?   -  person HimBromBeere    schedule 06.03.2019
comment
@HimBromBeere Мне нужно все, что ты перечислил   -  person Oleg Ivanytskyi    schedule 06.03.2019
comment
Как насчет повторения элементов? Вы должны предоставить гораздо больше информации в своем вопросе, а не в комментариях.   -  person HimBromBeere    schedule 06.03.2019
comment
Спасибо всем за помощь)   -  person Oleg Ivanytskyi    schedule 06.03.2019
comment
Возможный дубликат stackoverflow.com/ вопросы/44824519/   -  person HimBromBeere    schedule 06.03.2019


Ответы (2)


Вы должны реализовать IList<T> для доступа к элементам коллекции по их индексу. IList<T> наследуется от ICollection<T>, IEnumerable<T> и IEnumerable, так что вы все равно их получите.

Для более простой коллекции без доступа к элементу по индексу вы реализуете ICollection<T>, который приходит с IEnumerable<T> и IEnumerable через наследование.

Вы можете дополнительно реализовать IReadOnlyList<T> (или IReadOnlyCollection<T> соответственно), но обычно в этом нет необходимости.

Вы также должны вместо этого рассмотреть возможность наследования от System.Collections.ObjectModel.Collection<T>, что является рекомендуемым способом, потому что стандартные реализации стандартного интерфейса уже сделаны за вас, и вы можете сосредоточиться на частях, которые делают вашу коллекцию особенной.

person Sefe    schedule 06.03.2019
comment
В зависимости от того, что OP хочет сделать с коллекцией, реализация IList может быть или не быть необходимой. - person HimBromBeere; 06.03.2019
comment
Я разъяснил проблему списков и коллекций. - person Sefe; 06.03.2019
comment
Хорошо, я понял, теперь это имеет смысл - person Oleg Ivanytskyi; 06.03.2019
comment
Я отмечу это как ответ через 4 минуты, так как Stackoverflow не позволяет мне сделать это сейчас) - person Oleg Ivanytskyi; 06.03.2019

Для чего ваша коллекция? Если вы реализуете IEnumerable<T> (что влечет за собой реализацию IEnumerable, то у вас есть перечисляемый объект. Если у вас также есть метод Add(), у вас есть перечисляемый объект, который работает с инициализацией коллекции. Помимо этого, посмотрите на общие интерфейсы коллекции и спросите, полезны ли они для ваших вариантов использования, особенно ICollection<T> (в частности, добавление и удаление) и IList<T> (в частности, индексация).

person Jon Hanna    schedule 06.03.2019