Наследование из списка <T> в .NET(vb или С#)

Я некоторое время искал в С++-мире, но теперь я снова в .NET-мире, VB и С#, и я задавался вопросом, есть ли у вас класс, представляющий коллекцию чего-то, и вы хотите использовать это в цикле foreach и т.д.... лучше ли реализовать IEnumerable и IEnumerator самостоятельно или вы должны наследовать от List<T>, где T - это тип объекта в его единственной форме?

Я знаю, например, в С++, наследование из контейнера считается плохой идеей.

Но как насчет .NET.

EDIT:

Кажется, мой вопрос был слегка неправильно понят. Я вообще не несчастлив с существующими коллекциями в .NET. Вот моя проблема: у меня есть класс под названием "Лицо", и мне нужна коллекция под названием "Скауты", которую я хочу в классе "Скауты", в этот момент я бы хотел написать

foreach Person in Scouts...

Каков наилучший способ получить этих скаутов в виде коллекции людей и использовать его в цикле foreach?

Ответы

Ответ 1

Ты сказал:

У меня есть класс под названием "Человек" и я нужна коллекция под названием "Скауты", который я хочу в классе, называемом "Скауты", в этот момент я бы хотел быть способный писать

foreach Person in Scouts ...

Если вы правильно поняли, вы хотите:

class Scouts : IEnumerable<Person>
{
    private List<Person> scouts;

    public IEnumerator<Person> GetEnumerator()
    {
        return scouts.GetEnumerator();
    }
}

Ответ 2

В .NET редко реализуется IEnumerable<T> или получается из List<T>. Если вам нужна динамическая коллекция длин с индексом, вы можете напрямую использовать List<T>, и если вам нужна коллекция с фиксированной длиной, вы можете использовать массив T[]. Пространство имен System.Collections.Generic содержит большинство общих классов коллекций.

Ответ 3

Реальный вопрос: зачем вы хотите реализовать свою собственную "коллекцию чего-то"? То есть, почему именно вас не устраивают существующие коллекции?

Как только вы ответите на этот вопрос (и все еще уверены, что хотите это сделать), вам было бы лучше наследовать от одной из коллекций в пространстве имен System.Collections.ObjectModel, а именно Collection<T>, KeyedCollection<T> или ReadOnlyCollection<T>, в зависимости от ваших конкретных потребностей.

Ответ 4

Тони, как обычно, "это зависит". Основное различие между IEnumerable и IList заключается в возможности добавления и сортировки в IList.

Как сказал Дарин, более распространенным является просто использование классов напрямую, а не реализация интерфейсов вообще.