Procedimiento para consultar un objeto ArrayList con LINQ (C#)

Cuando use LINQ para consultar colecciones no genéricas IEnumerable como ArrayList, debe declarar explícitamente el tipo de variable de rango para reflejar el tipo específico de los objetos de la colección. Por ejemplo, si tiene una ArrayList de objetos Student, la cláusula from debe tener un aspecto similar a este:

var query = from Student s in arrList  
//...

Al especificar el tipo de la variable de rango, se convierte cada elemento de la ArrayList en un Student.

El uso de una variable de rango con tipo explícito en una expresión de consulta es equivalente a llamar al método Cast. Cast genera una excepción si la conversión especificada no puede realizarse. Cast y OfType son los dos métodos de operador de consulta estándar que funcionan en tipos IEnumerable no genéricos. Para obtener más información, vea Relaciones entre tipos en operaciones de consulta LINQ.

Ejemplo

En el siguiente ejemplo se muestra una consulta simple sobre un ArrayList. Tenga en cuenta que en este ejemplo se usan inicializadores de objeto cuando el código llama al método Add, pero esto no es un requisito.

using System;  
using System.Collections;  
using System.Linq;  
  
namespace NonGenericLINQ  
{  
    public class Student  
    {  
        public string FirstName { get; set; }  
        public string LastName { get; set; }  
        public int[] Scores { get; set; }  
    }  
  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            ArrayList arrList = new ArrayList();  
            arrList.Add(  
                new Student  
                    {  
                        FirstName = "Svetlana", LastName = "Omelchenko", Scores = new int[] { 98, 92, 81, 60 }  
                    });  
            arrList.Add(  
                new Student  
                    {  
                        FirstName = "Claire", LastName = "O’Donnell", Scores = new int[] { 75, 84, 91, 39 }  
                    });  
            arrList.Add(  
                new Student  
                    {  
                        FirstName = "Sven", LastName = "Mortensen", Scores = new int[] { 88, 94, 65, 91 }  
                    });  
            arrList.Add(  
                new Student  
                    {  
                        FirstName = "Cesar", LastName = "Garcia", Scores = new int[] { 97, 89, 85, 82 }  
                    });  
  
            var query = from Student student in arrList  
                        where student.Scores[0] > 95  
                        select student;  
  
            foreach (Student s in query)  
                Console.WriteLine(s.LastName + ": " + s.Scores[0]);  
        }  
    }  
}  
/* Output:
    Omelchenko: 98  
    Garcia: 97  
*/