2010-05-10 1 views

ответ

10

Вы можете использовать LINQ с любыми IEnumerable с помощью функции Cast<T>() или функции OfType<T>(). Если вы уверены, что IEnumerable содержит только объекты определенного типа, то Cast<T>() будет немного быстрее.

Например,

ArrayList foo = new ArrayList(); 

foo.Add("bar"); 
foo.Add("baz"); 

var bar = foo.Cast<string>().Select(s => s.ToUpper()); 

Есть много существующих классов (как ArrayList), которые существовали до появления дженериков в .NET, поэтому они до сих пор не унифицированная.

+0

Насколько это будет удачным? –

+0

@Chris: Очень мало с 'Cast', и только очень немного с' OfType' (так как проверка типов выполняется дважды). –

2

Эти классы часто встречаются до того, как в .net было много дженериков. Многие из этих классов имеют общие эквиваленты, но не все. Есть также обходные пути. например с linq любые не общие коллекции могут быть сделаны linqy и generic с использованием методов расширения .Cast() и .OfType().

+0

+1 для использования «linqy» –

+0

Linqy - отличное слово, но предпочитает тот, который был придуман coleague после добавления кучи UpdatePanels на его страницу asp.net. Он объявил, что просто «аяксифицировал» свою страницу ;-) –

2

Имейте в виду, что многие типы BCL, которые мы используем, относятся к моменту до дженериков, которые прибыли в 2.0. Тем не менее, вы все равно можете использовать LINQ со многими из них, вам просто нужно сделать небольшую дополнительную работу.

ArrayList arrayList = new ArrayList(); 
arrayList.Add(1); 
arrayList.Add(2); 

var query = from item in arrayList.OfType<int>() select item; 
+2

Это будет * фильтровать * элементы в ArrayList только для тех, которые имеют тип int. –

12

История имеет значение. Дженерики не всегда существуют, поэтому вы можете столкнуться с классами и API, которые были разработаны до появления дженериков.

Также целевая аудитория имеет значение. Некоторые функции ориентированы на аудиторию разработчиков, которые могут иметь problems understanding generics:

компромиссных: API-интерфейсы, используя некоторые дополнительные особенности дженериков может быть слишком трудно использовать для некоторых разработчиков. Понятие Дженерики не является широко понял, в некоторых случаях синтаксис может создавать проблемы, и, как любой большой новой функции Дженерики могут представлять кривую существенное для обучения некоторых разработчиков начального уровня.

Да, цитата указана с 2004 года, но некоторые, если не большинство .Net API, которые вы используете сегодня, вышли в 2005 году, поэтому цитата на самом деле очень актуальна.

+2

+1 В предыдущих обсуждениях с персоналом MS они очень сдержанны, чтобы внести изменения в общедоступные API (или даже аддитивные изменения в интерфейсы), поскольку это приведет к поломке существующих разработчиков интерфейса).если вы чистый потребитель, это звучит как боль в заднице, но как только вы находитесь в своем положении (создаете API для потребления других), вы быстро начинаете сопереживать и следовать подобным методам, поскольку это облегчает вашу собственную жизнь и способствует более быстрому внедрению более новых, поддерживаемых версий. –