У меня есть класс, который реализует IEnumerable
, но не реализует IEnumerable<T>
. Я не могу изменить этот класс и не могу использовать вместо него другой класс. Как я понял из MSDN, LINQ можно использовать, если класс реализуетIEnumerable<T>
. Я пробовал использовать instance.ToQueryable()
, но методы LINQ все еще не включены. Я точно знаю, что этот класс может содержать экземпляры только одного типа, поэтому класс можно реализовать IEnumerable<T>
, но это не так. Итак, что я могу сделать, чтобы запросить этот класс с помощью выражений LINQ?
.net
linq
ienumerable
Богдан Вербенец
источник
источник
Ответы:
Вы можете использовать
Cast<T>()
или,OfType<T>
чтобы получить универсальную версию IEnumerable, полностью поддерживающую LINQ.Например.
IEnumerable objects = ...; IEnumerable<string> strings = objects.Cast<string>();
Или, если вы не знаете, какой тип он содержит, вы всегда можете сделать:
IEnumerable<object> e = objects.Cast<object>();
Если ваш неуниверсальный
IEnumerable
содержит объекты различных типов, и вас интересуют только, например, строки, которые вы можете делать:IEnumerable<string> strings = objects.OfType<string>();
источник
Да, оно может. Вам просто нужно использовать
Cast<T>
функцию, чтобы преобразовать его в типизированныйIEnumerable<T>
. Например:IEnumerable e = ...; IEnumerable<object> e2 = e.Cast<object>();
Теперь
e2
естьIEnumerable<T>
и может работать со всеми функциями LINQ.источник
Вы также можете использовать синтаксис понимания запросов LINQ, который приводит к типу переменной диапазона (
item
в этом примере), если тип указан:IEnumerable list = new ArrayList { "dog", "cat" }; IEnumerable<string> result = from string item in list select item; foreach (string s in result) { // InvalidCastException at runtime if element is not a string Console.WriteLine(s); }
Эффект идентичен решению @ JaredPar; подробности см. в 7.16.2.2: Явные типы переменных диапазона в спецификации языка C #.
источник