Почему делают столько названных коллекций в.NET не осуществляет IEnumerable <T>?

Случайный пример:

ConfigurationElementCollection

.Net has tons of these little WhateverCollection classes that don't implement IEnumerable, which means I can't use Linq to objects with them out of the box. Even before Linq, you'd think they would have wanted to make use of generics (which were introduced all the way back in C# 2 I believe)

Кажется, что я натыкаюсь на эти раздражающие небольшие типы коллекции все время. Есть ли некоторая техническая причина?

12
добавлено
Просмотры: 2
nl ja de
Они были представлены, прежде чем непатентованные средства были доступны.
добавлено автор Eric J., источник
@EricJ: Конечно, непатентованные средства wasn' t доступный в 1.0. Но реальный вопрос: "Почему didn' t команда BCL добавляют универсальный интерфейс к тем классам в.NET 2.0?".
добавлено автор Steven, источник
И долго были, так как я продержался использованию ArrayList.
добавлено автор deerchao, источник
добавлено автор shahkalpesh, источник
Возможно, это было бы ломающееся изменение, особенно относительно преобразования в последовательную форму/десериализации.
добавлено автор Matthew Watson, источник
Можно технически использовать LINQ "из коробки" при помощи OfType или Бросок , если коллекция имеет тенденцию содержать сильный тип, пока это, по крайней мере, осуществляет IEnumerable (неуниверсальный). <�кодовый> OfType / , к которому Бросок приводит универсальный IEnumerable случаи, и таким образом открывает остальную часть операторов LINQ.
добавлено автор Adam Houldsworth, источник
Спасибо @AdamHouldsworth, который полезен
добавлено автор Erix, источник
@EricJ. Добавьте что как ответ если вы don' t ум.
добавлено автор Erix, источник

2 ответы

Ответ находится в названии вопроса: "названный коллекциями". Который является путем, необходимо было сделать коллекции безопасными с точки зрения типов, прежде чем непатентованные средства стали доступными. Есть многие из них в коде, который относится ко времени.NET 1.x, особенно Winforms. Не было никакого разумного способа переписать их использующий непатентованные средства, которые нарушат слишком много существующего кода.

Таким образом, названный тип коллекции безопасен с точки зрения типов, но протирать является Система. Коллекции. IEnumerator. Ток, собственность текстового объекта. Вы можете Linqify эти коллекции при помощи OfType() или Бросок ().

7
добавлено

As Adam Houldsworth said in a comment already, you simply need to use the Cast<> method.

Пример:

var a = new DogCollection();
var allFidos = a.Cast().Where(d => d.Name == "Fido"); 
1
добавлено