У меня есть класс, который реализует IEnumerable
, но не реализует IEnumerable<T>
. Я не могу изменить этот класс, и я не могу использовать другой класс вместо него. Как я понял из MSDN LINQ может использоваться, если класс реализует IEnumerable<T>
. Я пробовал использовать instance.ToQueryable()
, но он по-прежнему не поддерживает методы LINQ. Я точно знаю, что этот класс может содержать экземпляры только одного типа, поэтому класс может реализовать IEnumerable<T>
, но это просто не так. Итак, что я могу сделать, чтобы запросить этот класс с использованием выражений LINQ?
LINQ работает с IEnumerable?
Ответ 1
Вы можете использовать Cast<T>()
или OfType<T>
, чтобы получить общую версию IEnumerable, которая полностью поддерживает LINQ.
Eg.
IEnumerable objects = ...;
IEnumerable<string> strings = objects.Cast<string>();
Или, если вы не знаете, какой тип он содержит, вы всегда можете:
IEnumerable<object> e = objects.Cast<object>();
Если ваш не-общий IEnumerable
содержит объекты разных типов, вас интересует, например. строки, которые вы можете сделать:
IEnumerable<string> strings = objects.OfType<string>();
Ответ 2
Да, может. Вам просто нужно использовать функцию Cast
, чтобы преобразовать ее в типизированный IEnumerable<T>
. Например
IEnumerable e = ...;
IEnumreable<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: Явные типы переменных диапазона в спецификации языка С# для деталей.
Ответ 4
Да, он делает,
Я дам вам короткий пример, чтобы лучше понять вас
List<Student> obj = new List<Student>();
obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" });
obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" });
obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" });
obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" });
obj.Add(new Student() { name = "xyz", roll = 12, school = "pqr" });
IEnumerable<Student> students = from x in obj.AsEnumerable()
select x;
foreach (var item in students)
{
MessageBox.Show(item.name);
}
class Student
{
public string name { get; set; }
public int roll { get; set; }
public string school { get; set; }
}