Будет ли Microsoft когда-либо делать все коллекции пригодными для использования LINQ? - PullRequest
9 голосов
/ 12 февраля 2010

Я уже некоторое время использую LINQ (и наслаждаюсь им), но мне кажется, что я столкнулся с ускоренным ударом, когда сталкиваюсь со специализированными коллекциями .NET (DataRowCollection, ControlCollection). Есть ли способ использовать LINQ с этими специализированными элементами управления, и если нет, как вы думаете, Microsoft решит эту проблему в следующем выпуске платформы? Или нам осталось перебрать эти не-LINQ-пути или сами вытянуть элементы из коллекции в коллекции с поддержкой LINQ?

Ответы [ 3 ]

22 голосов
/ 12 февраля 2010

Причина, по которой коллекции типа ControlCollection не работают с LINQ, заключается в том, что они не строго типизированы. Без типа элемента LINQ не может создавать строго типизированные методы. Если вы знаете тип, вы можете использовать метод Cast для создания строго типизированного перечисления и, следовательно, использовать его с LINQ. Например

ControlCollection col = ...
var query = col.Cast<Control>().Where(x => ...);

Что касается того, Microsoft когда-нибудь сделает так, чтобы они реализовали IEnumerable<T> по умолчанию. Мое предположение не здесь. Причина в том, что это является серьезным изменением и может привести к ожидаемому поведению в коде. Даже простая реализация IEnumerable<Control> для ControlCollection приведет к изменениям разрешения перегрузки, которые могут, и почти наверняка, нарушат работу пользовательских приложений.

4 голосов
/ 12 февраля 2010

Вы должны быть в состоянии сделать что-то вроде этого:

myDataRowCollection.Cast<DataRow>().Where.....

и используйте Linq таким образом. Если вы знаете, что представляют собой объекты в коллекции, вы сможете использовать это.

1 голос
/ 12 февраля 2010

Причина этого в следующем: коллекции, которые не реализуют IEnumerable<T> или IQueryable, не могут быть повторены в LINQ

...