2010-03-16 19 views
5
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; 
} 

El siguiente código no se compila. El error es ArrayList is not IEnumerableLINQ: ¿por qué esta consulta no funciona en una ArrayList?

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

Esto compila:

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

¿Alguien puede explicar cuál es la diferencia entre estos dos fragmentos? ¿Por qué el segundo funciona?

Respuesta

9

Como ArrayList le permite recopilar objetos de diferentes tipos, el compilador no sabe qué tipo necesita para funcionar.

La segunda consulta expulsa explícitamente cada objeto en ArrayList para escribir Student.

Considere utilizar List<> en lugar de ArrayList.

2

La lista de arreglos está sin tipo, por lo que debe definir qué tipo espera. Use la clase List que está fuertemente tipada con genéricos.

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

En el segundo caso, le está diciendo a LINQ cuál es el tipo de la colección. ArrayList tipos débiles, por lo que con el fin de utilizarla de manera eficaz en LINQ puede utilizar moldeada <T>:

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

Tenga en cuenta que el error que consigo por el fragmento es:

No se pudo encontrar una implementación de el patrón de consulta para el tipo de fuente 'System.Collections.ArrayList'. 'Seleccionar' no encontrado. Considere especificando explícitamente el tipo de la variable de rango 'r'.

Así que creo que una solución alternativa (casi definitivamente no es una idea mejor) es definir un método de Selección de Extensión para ArrayList.

Supongo que el error diferente se debe a otros espacios de nombres incluidos.

+0

Algo debo añadir, ya que responde directamente a la pregunta, la segunda versión (de trabajo) se implementa internamente como res var = de r en lstStudents.Cast () seleccione r; –

-1

ArrayList.Cast().Select()

+3

-1 porque esto no responde la pregunta. –

Cuestiones relacionadas