HOW TO:使用 LINQ 查詢 ArrayList
更新:2007 年 11 月
使用 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> 會擲回例外狀況 (Exception)。Cast<TResult> 和 OfType<TResult> 是可以對非泛型 IEnumerable 型別執行的兩個標準查詢運算子方法。
範例
下列範例顯示透過 ArrayList 的簡單查詢。請注意,在程式碼呼叫 Add 方法時,這個範例使用的是物件初始設定式,但這不是必要的。
Imports System.Collections
Imports System.Linq
Module Module1
Public Class Student
Public FirstName As String
Public LastName As String
Public 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
*/