如何:使用 LINQ 查询 ArrayList

在使用 LINQ 查询非泛型 IEnumerable 集合(如 ArrayList)时,您必须显式声明范围变量的类型以反映此集合中对象的特定类型。 例如,如果您具有 Student 对象的 ArrayList,则 from 子句 (C#) 或 From 子句 (Visual Basic) 应类似于:

// C#
var query = from Student s in arrList
... 
'Visual Basic
Dim query = From student As Student In arrList 
...

通过指定范围变量的类型,您将 ArrayList 中的各个项强制转换为 Student。

在查询表达式中使用显式类型化的范围变量与调用 Cast<TResult> 方法等效。 如果无法执行指定的强制转换,则 Cast<TResult> 引发异常。 Cast<TResult>OfType<TResult> 是两种对非泛型 IEnumerable 类型操作的标准查询运算符方法。 在 Visual Basic 中,您必须对数据源显式调用 Cast<TResult> 方法以确保特定的范围变量类型。 有关更多信息,请参见查询操作中的类型关系 (Visual Basic)LINQ 查询操作中的类型关系 (C#)

示例

下面的示例演示一个对 ArrayList 的简单查询。 请注意,此示例在代码调用 Add 方法时使用对象初始值设定项,但这不是必需的。

Imports System.Collections
Imports System.Linq

Module Module1

    Public Class Student
        Public Property FirstName As String
        Public Property LastName As String
        Public Property Scores As Integer()
    End Class

    Sub Main()

        Dim student1 As New Student With {.FirstName = "Svetlana", 
                                     .LastName = "Omelchenko", 
                                     .Scores = New Integer() {98, 92, 81, 60}}
        Dim student2 As New Student With {.FirstName = "Claire", 
                                    .LastName = "O'Donnell", 
                                    .Scores = New Integer() {75, 84, 91, 39}}
        Dim student3 As New Student With {.FirstName = "Cesar", 
                                    .LastName = "Garcia", 
                                    .Scores = New Integer() {97, 89, 85, 82}}
        Dim student4 As New Student With {.FirstName = "Sven", 
                                    .LastName = "Mortensen", 
                                    .Scores = New Integer() {88, 94, 65, 91}}

        Dim arrList As New ArrayList()
        arrList.Add(student1)
        arrList.Add(student2)
        arrList.Add(student3)
        arrList.Add(student4)

        ' Use an explicit type for non-generic collections
        Dim query = From student As Student In arrList 
                    Where student.Scores(0) > 95 
                    Select student

        For Each student As Student In query
            Console.WriteLine(student.LastName & ": " & student.Scores(0))
        Next
        ' Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.")
        Console.ReadKey()
    End Sub

End Module
' Output:
'   Omelchenko: 98
'   Garcia: 97
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]);

            // Keep the console window open in debug mode.
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
}
/* Output: 
    Omelchenko: 98
    Garcia: 97
*/

请参见

概念

LINQ to Objects