LINQ:为什么这个查询不适用于ArrayList?

时间:2010-03-16 05:00:51

标签: c# linq

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;

有人可以解释这两个片段之间的区别吗?为什么第二个有效?

5 个答案:

答案 0 :(得分:9)

由于ArrayList允许您收集不同类型的对象,因此编译器不知道它需要操作什么类型。

第二个查询显式地将ArrayList中的每个对象强制转换为Student。

考虑使用List<>而不是ArrayList。

答案 1 :(得分:8)

在第二种情况下,您告诉LINQ该集合的类型是什么。 ArrayList是弱类型的,因此为了在LINQ中有效地使用它,您可以使用Cast<T>

IEnumerable<Student> _set = lstStudents.Cast<Student>();

答案 2 :(得分:2)

数组列表是无类型的,因此您必须定义所需的类型。使用强类型泛型的List类。

List<Student> lstStudents = GetStudentAsArrayList();
var res = from  r in lstStudents select r;

答案 3 :(得分:1)

请注意,我为您的代码段获得的错误是:

  

无法找到实现   源类型的查询模式   'System.Collections.ArrayList'。   找不到“选择”。考虑   明确指定的类型   范围变量'r'。

所以我相信一个替代解决方案(几乎肯定不是更好的一个),为ArrayList定义一个Select Extension方法。

我猜不同的错误是由于包含了其他名称空间。

答案 4 :(得分:0)

ArrayList.Cast().Select()