Подтвердить что ты не робот

LINQ работает с IEnumerable?

У меня есть класс, который реализует IEnumerable, но не реализует IEnumerable<T>. Я не могу изменить этот класс, и я не могу использовать другой класс вместо него. Как я понял из MSDN LINQ может использоваться, если класс реализует IEnumerable<T>. Я пробовал использовать instance.ToQueryable(), но он по-прежнему не поддерживает методы LINQ. Я точно знаю, что этот класс может содержать экземпляры только одного типа, поэтому класс может реализовать IEnumerable<T>, но это просто не так. Итак, что я могу сделать, чтобы запросить этот класс с использованием выражений LINQ?

4b9b3361

Ответ 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; }
        }