Чи працює LINQ з IEnumerable?


87

У мене є клас, який реалізує IEnumerable, але не реалізує IEnumerable<T>. Я не можу змінити цей клас і не можу використовувати інший клас замість нього. Як я зрозумів з MSDN, LINQ може використовуватися, якщо клас реалізуєIEnumerable<T> . Я намагався використовувати instance.ToQueryable(), але він все ще не вмикає методи LINQ. Я точно знаю, що цей клас може містити екземпляри лише одного типу, тому клас міг би реалізовувати IEnumerable<T>, але цього просто немає. То що я можу зробити для запиту цього класу за допомогою виразів LINQ?


Без трансляції IEnumerable замість усіх методів linq ви побачите лише 8 методів: AsQueryable, Cast <>, Equals, GetEnumerator, GetHashCode, GetType, OfType <>, ToString
ShawnFeatherly

Відповіді:


136

Ви можете використовувати 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>();

2
Щодня я дізнаюся щось нове про LINQ. З кожним днем ​​я люблю це все більше і більше.
Жоао Мендес

11

Так це може. Вам просто потрібно скористатися Cast<T>функцією, щоб перетворити її на набрану IEnumerable<T>. Наприклад:

IEnumerable e = ...;
IEnumerable<object> e2 = e.Cast<object>();

Зараз e2є IEnumerable<T>і може працювати з усіма функціями LINQ.


3

Ви також можете використовувати синтаксис розуміння запитів 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 # для деталей.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.