Abfragen einer ArrayList mit LINQ (Visual Basic)

Bei Verwendung von LINQ zum Abfragen nicht generischer IEnumerable-Auflistungen wie z.B. ArrayList müssen Sie den Typ der Bereichsvariablen entsprechend dem spezifischen Typ der Objekte in der Auflistung explizit deklarieren. Wenn Sie zum Beispiel eine ArrayList mit Student-Objekten haben, sollte die From-Klausel wie folgt aussehen:

Dim query = From student As Student In arrList
'...

Indem Sie den Typ der Bereichsvariablen angeben, wandeln Sie jedes Element in der ArrayList in ein Student um.

Die Verwendung einer explizit typisierten Bereichsvariablen in einem Abfrageausdruck entspricht dem Aufrufen der Cast-Methode. Cast löst eine Ausnahme aus, wenn bei der Umwandlung ein Fehler auftritt. Cast und OfType sind zwei Standardabfrageoperator-Methoden, die mit nicht generischen IEnumerable-Typen arbeiten. In Visual Basic müssen Sie die Cast-Methode explizit für die Datenquelle aufrufen, um einen bestimmten Bereichsvariablentyp sicherzustellen. Weitere Informationen finden Sie unter Typbeziehungen in Abfragevorgängen (Visual Basic).

Beispiel

Im folgenden Beispiel wird eine einfache Abfrage von ArrayList veranschaulicht. Beachten Sie, dass in diesem Beispiel Objektinitialisierer verwendet werden, wenn der Code die Add-Methode aufruft, aber dies ist keine Voraussetzung.

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

Siehe auch