HOW TO:使用 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 中的每個項目轉換 (Cast) 為 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
*/