LINQ: почему это запрашивает не, работают над ArrayList?

public static  ArrayList   GetStudentAsArrayList()
{
    ArrayList  students = new ArrayList
    {
        new Student() { RollNumber = 1,Name ="Alex " , Section = 1 ,HostelNumber=1 },
        new Student() { RollNumber = 2,Name ="Jonty " , Section = 2 ,HostelNumber=2 }
    };
    return students;
}

Следующий код не компилирует. Ошибка ArrayList is not IEnumerable

ArrayList lstStudents = GetStudentAsArrayList();
var res = from r in lstStudents select r;  

Это компилирует:

ArrayList lstStudents = GetStudentAsArrayList();
var res = from  Student   r in lstStudents select r;

Кто-либо может объяснить, что различие между этими двумя отрывками? Почему вторые работы?

7
задан Benny 16 March 2010 в 05:10
поделиться

4 ответа

Поскольку ArrayList позволяет собирать объекты разных типов, компилятор не знает, над каким типом ему нужно оперировать.

Во втором запросе каждый объект в ArrayList явно приводится к типу Student.

Рассмотрите возможность использования List<> вместо ArrayList.

10
ответ дан 6 December 2019 в 08:42
поделиться

Во втором случае вы сообщаете LINQ тип коллекции. ArrayList является слабо типизированным, поэтому для его эффективного использования в LINQ можно применить Cast:

IEnumerable<Student> _set = lstStudents.Cast<Student>();
8
ответ дан 6 December 2019 в 08:42
поделиться

Список массивов является нетипизированным, поэтому вы должны определить, какой тип вы ожидаете. Используйте класс List, который является сильно типизированным с дженериками.

List<Student> lstStudents = GetStudentAsArrayList();
var res = from  r in lstStudents select r;
2
ответ дан 6 December 2019 в 08:42
поделиться

Обратите внимание, что для вашего фрагмента я получаю следующую ошибку:

Не удалось найти реализацию шаблона запроса для исходного типа 'System.Collections.ArrayList'. "Выбрать" не найдено. Рассмотрим явное указание типа переменной диапазона 'r'.

Итак, я считаю, что альтернативным решением (почти определенно не лучшим, заметьте) является определение метода Select Extension для ArrayList.

Я предполагаю, что другая ошибка связана с другими включенными пространствами имен.

1
ответ дан 6 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: