LINQ:为什么这个查询不适用于ArrayList?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
任何人都可以解释这两个片段之间的区别吗?为什么第二个有效?
答案
由于ArrayList允许您收集不同类型的对象,因此编译器不知道它需要操作什么类型。
第二个查询显式地将ArrayList中的每个对象强制转换为类型Student。
考虑使用List<>
而不是ArrayList。
另一答案
在第二种情况下,您告诉LINQ该集合的类型是什么。 ArrayList
是弱类型的,所以为了在LINQ中有效地使用它,你可以使用Cast<T>
:
IEnumerable<Student> _set = lstStudents.Cast<Student>();
另一答案
数组列表是无类型的,因此您必须定义所需的类型。使用强类型泛型的List类。
List<Student> lstStudents = GetStudentAsArrayList();
var res = from r in lstStudents select r;
另一答案
请注意,我为您的代码段获得的错误是:
无法找到源类型“System.Collections.ArrayList”的查询模式的实现。找不到“选择”。考虑明确指定范围变量'r'的类型。
因此,我认为另一种解决方案(几乎肯定不是更好的一种解决方法)是为ArrayList定义一个Select Extension方法。
我猜不同的错误是由于包含其他命名空间。
另一答案
ArrayList.Cast().Select()
以上是关于LINQ:为什么这个查询不适用于ArrayList?的主要内容,如果未能解决你的问题,请参考以下文章
SQL Compact 不适用于 Linq to Sql,我应该使用啥?
为啥 mysql 中的这个查询适用于该表,但不适用于该表的视图?