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;
Кто-либо может объяснить, что различие между этими двумя отрывками? Почему вторые работы?
Поскольку ArrayList позволяет собирать объекты разных типов, компилятор не знает, над каким типом ему нужно оперировать.
Во втором запросе каждый объект в ArrayList явно приводится к типу Student.
Рассмотрите возможность использования List<>
вместо ArrayList.
Во втором случае вы сообщаете LINQ тип коллекции. ArrayList
является слабо типизированным, поэтому для его эффективного использования в LINQ можно применить Cast
:
IEnumerable<Student> _set = lstStudents.Cast<Student>();
Список массивов является нетипизированным, поэтому вы должны определить, какой тип вы ожидаете. Используйте класс List, который является сильно типизированным с дженериками.
List<Student> lstStudents = GetStudentAsArrayList();
var res = from r in lstStudents select r;
Обратите внимание, что для вашего фрагмента я получаю следующую ошибку:
Не удалось найти реализацию шаблона запроса для исходного типа 'System.Collections.ArrayList'. "Выбрать" не найдено. Рассмотрим явное указание типа переменной диапазона 'r'.
Итак, я считаю, что альтернативным решением (почти определенно не лучшим, заметьте) является определение метода Select Extension для ArrayList.
Я предполагаю, что другая ошибка связана с другими включенными пространствами имен.