Работает ли LINQ с IEnumerable?



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

571   4  

4 ответов:

можно использовать 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 функция, чтобы получить его для преобразования в типизированный IEnumerable<T>. Например

IEnumerable e = ...;
IEnumreable<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# для деталей.

да,

Я дам вам короткий пример, чтобы понять вас лучше

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; }
        }

Comments

    Ничего не найдено.