Какой самый базовый класс, который наследует ICollection <T> - PullRequest
4 голосов
/ 04 мая 2010

Мне нужен общий класс коллекции, который я могу добавить и перечислить. Поскольку ICollection<T> наследуется от IEnumerable<T>, классу действительно нужно наследовать от ICollection<T>. Существует ли простой базовый класс в BCL, который просто наследует ICollection<T>, как универсальная версия CollectionBase? Если нет, то какой класс подходит ближе всего?

Я бы предположил List<T>, что я и использовал, но мне не нужен последовательный аспект. Есть ли что-нибудь лучше (под этим я подразумеваю [меньший объем памяти / более быстрый доступ / более простой])? Сумка была бы идеальной, если бы она существовала.

РЕДАКТИРОВАТЬ 1: В моем конкретном случае я .concat обращаюсь к другому IEnumerable, запрашиваю его и затем отображаю результаты (в произвольном порядке). Я не пытаюсь сделать свой собственный класс. Мне просто нужно было сделать одноразовую коллекцию столько раз, что я подумал, что было бы полезно найти лучший одноразовый для использования. Поскольку я чувствую, что много раз делал нечто подобное, я чувствовал, что должен держать этот вопрос как можно более общим (без каламбура), теперь я знаю лучше.

РЕДАКТИРОВАТЬ 2: Спасибо за ответы всех, как указывал @BlueRaja, у любого простого класса будут примерно одинаковые накладные расходы, и поэтому я думаю, что буду придерживаться своих оригинальных способов использования List<T>. Поскольку все они примерно одинаковы, мои глупые причины «легче напечатать» и «мне не нужно вводить еще одно использование» не такие уж плохие причины.

Ответы [ 5 ]

2 голосов
/ 04 мая 2010

[меньший объем памяти / более быстрый доступ / более простой]

Все они будут иметь примерно одинаковый объем памяти, и если вы используете ICollection, интерфейс не изменится.

Что действительно важно, так это то, что масштабируется лучше всего для необходимых вам операций: связанный список лучше добавляет / удаляет (элементы head / tail), в то время как список на основе массива имеет произвольный доступ. Есть и другие структуры, которые вы должны использовать, зависит от вашего приложения.

1 голос
/ 04 мая 2010

Меньше и быстрее все зависит от того, что именно вы делаете и каковы ваши потребности. Единственный другой класс, который я мог бы рекомендовать - это LinkedList<>, который реализует ICollection<>.

1 голос
/ 04 мая 2010

Возможно, вы захотите посмотреть на Collection<T>. Это было разработано для явной цели подкласса, поскольку документация указывает:

Предоставляет базовый класс для универсальной коллекции.

Сказав это, любая из коллекций в порядке; Я унаследовал от List<T>, Stack<T> и т. Д .; выберите тот, который ближе всего к функциональности, которая вам действительно нужна.

0 голосов
/ 04 мая 2010

CollectionBase существовал главным образом для обеспечения простого механизма для создания типизированных коллекций. С Generics, все коллекции теперь напечатаны. В подавляющем большинстве случаев, когда использовались расширения CollectionBase, теперь следует использовать любую из встроенных коллекций, например List<> или LinkedList<>.

.

Collection<> по-прежнему существует для тех, кому необходимо предоставить собственную коллекцию по причинам, отличным от типа (то есть дополнительная проверка при добавлении или некоторая нестандартная логика) Collection<> не так часто используется, как CollectionBase, и служит для гораздо меньшей потребности.

0 голосов
/ 04 мая 2010

Вы можете использовать Reflector , чтобы проверить .NET FCL и посмотреть, какие классы используют эту коллекцию.(Существует функция поиска, которая может быть запущена с помощью F3.)

Вы также можете взглянуть на C5 Library , чтобы увидеть, была ли уже реализована коллекция, отвечающая вашим потребностям.На странице 13 руководства C5 приведена иерархия интерфейса коллекции.

...