Megosztás a következőn keresztül:


Útmutató: Egyéni metódusok hozzáadása LINQ-lekérdezésekhez (Visual Basic)

Bővítheti a LINQ-lekérdezésekhez használt metódusokat úgy, hogy bővítő metódusokat ad hozzá a IEnumerable<T> felülethez. A standard átlag vagy a maximális műveletek mellett például létrehozhat egy egyéni összesítési módszert, amellyel egyetlen értéket számíthat ki egy értéksorozatból. Olyan metódust is létrehozhat, amely egyéni szűrőként vagy adott adatátalakításként működik egy értéksorozathoz, és egy új sorozatot ad vissza. Ilyen módszerek például a Distinctkövetkezők: , Skipés Reverse.

Ha kibővíti a IEnumerable<T> felületet, az egyéni metódusokat bármilyen számba vehet gyűjteményre alkalmazhatja. További információért lásd Bővítési módszerek.

Összesítési módszer hozzáadása

Az összesítő metódus egyetlen értéket számít ki egy értékkészletből. A LINQ számos aggregátummetszetet biztosít, köztük Averagea . MinMax Létrehozhatja saját összesítő metódusát úgy, hogy hozzáad egy bővítménymetódust a IEnumerable<T> felülethez.

Az alábbi példakód bemutatja, hogyan hozhat létre egy olyan bővítménymetódust, amely egy számsorozat Medianmediánjának kiszámítására szolgáldouble.

Imports System.Runtime.CompilerServices

Module LINQExtension

    ' Extension method for the IEnumerable(of T) interface.
    ' The method accepts only values of the Double type.
    <Extension()>
    Function Median(ByVal source As IEnumerable(Of Double)) As Double
        If Not source.Any() Then
            Throw New InvalidOperationException("Cannot compute median for an empty set.")
        End If

        Dim sortedSource = (From number In source
                            Order By number).ToList()

        Dim itemIndex = sortedSource.Count \ 2

        If sortedSource.Count Mod 2 = 0 Then
            ' Even number of items in list.
            Return (sortedSource(itemIndex) + sortedSource(itemIndex - 1)) / 2
        Else
            ' Odd number of items in list.
            Return sortedSource(itemIndex)
        End If
    End Function
End Module

Ezt a bővítménymetódust bármely számbavehető gyűjteményhez ugyanúgy hívhatja meg, mint a felületről származó IEnumerable<T> összesítő metódusokat.

Megjegyzés:

Visual Basicben használhat metódushívást vagy szabványos lekérdezési szintaxist a Aggregate vagy a Group By záradékhoz. További információ: összesítő záradék és csoportosítási záradék.

Az alábbi példakód bemutatja, hogyan használhatja a Median metódust egy típustömbhöz double.

Dim numbers() As Double = {1.9, 2, 8, 4, 5.7, 6, 7.2, 0}

Dim query = Aggregate num In numbers Into Median()

Console.WriteLine("Double: Median = " & query)
' This code produces the following output:
'
' Double: Median = 4.85

Összesített metódus túlterhelése különböző típusok elfogadásához

Túlterhelheti az összesítő metódust, hogy különböző típusú sorozatokat fogadjon el. A szokásos módszer az, hogy minden típushoz túlterhelést kell létrehozni. Egy másik megközelítés egy olyan túlterhelés létrehozása, amely egy generikus típust fogad, és egy delegált segítségével alakítja át egy specifikus típusra. Mindkét megközelítést kombinálhatja is.

Túlterhelés létrehozása minden típushoz

Minden támogatni kívánt típushoz létrehozhat egy adott túlterhelést. Az alábbi példakód a Median metódus túlterhelését mutatja be a integer típushoz.

' Integer overload
<Extension()>
Function Median(ByVal source As IEnumerable(Of Integer)) As Double
    Return Aggregate num In source Select CDbl(num) Into med = Median()
End Function

Most már meghívhatja a Median túlterheléseket mindkét integer és double típus esetében, ahogyan az az alábbi kódban is látható:

Dim numbers1() As Double = {1.9, 2, 8, 4, 5.7, 6, 7.2, 0}

Dim query1 = Aggregate num In numbers1 Into Median()

Console.WriteLine("Double: Median = " & query1)

Dim numbers2() As Integer = {1, 2, 3, 4, 5}

Dim query2 = Aggregate num In numbers2 Into Median()

Console.WriteLine("Integer: Median = " & query2)

' This code produces the following output:
'
' Double: Median = 4.85
' Integer: Median = 3

Általános túlterhelés létrehozása

Olyan túlterhelést is létrehozhat, amely általános objektumok sorozatát fogadja el. Ez a túlterhelés egy delegáltat vesz fel paraméterként, és arra használja, hogy egy általános típusú objektumsorozatot egy adott típussá alakítson.

Az alábbi kód a metódus túlterhelését Median mutatja, amely a Func<T,TResult> delegáltat paraméterként veszi fel. Ez a meghatalmazott egy általános típusú T objektumot vesz fel, és egy típusobjektumot doublead vissza.

' Generic overload.
<Extension()>
Function Median(Of T)(ByVal source As IEnumerable(Of T),
                  ByVal selector As Func(Of T, Double)) As Double
    Return Aggregate num In source Select selector(num) Into med = Median()
End Function

Mostantól bármilyen típusú objektumsorozathoz meghívhatja a Median metódust. Ha a típus nem rendelkezik saját metódusterheléssel, meg kell adnia egy delegált paramétert. A Visual Basicben erre a célra használhat lambda kifejezést. Továbbá, ha a metódushívás helyett a Aggregate vagy Group By záradékot használja, a záradék hatókörében lévő bármely értéket vagy kifejezést átadhatja.

Az alábbi példakód bemutatja, hogyan hívhatja meg a Median metódust egész számok tömbjének és egy sztringtömbnek. Sztringek esetén a tömbben lévő sztringek hosszának mediánját számítja ki a rendszer. A példa bemutatja, hogyan adhatja át a Func<T,TResult> delegált paramétert az Median egyes esetek metódusának.

Dim numbers3() As Integer = {1, 2, 3, 4, 5}

' You can use num as a parameter for the Median method
' so that the compiler will implicitly convert its value to double.
' If there is no implicit conversion, the compiler will
' display an error message.

Dim query3 = Aggregate num In numbers3 Into Median(num)

Console.WriteLine("Integer: Median = " & query3)

Dim numbers4() As String = {"one", "two", "three", "four", "five"}

' With the generic overload, you can also use numeric properties of objects.

Dim query4 = Aggregate str In numbers4 Into Median(str.Length)

Console.WriteLine("String: Median = " & query4)

' This code produces the following output:
'
' Integer: Median = 3
' String: Median = 4

Gyűjteményt visszaadó metódus hozzáadása

A felületet kiterjesztheti IEnumerable<T> egy egyéni lekérdezési módszerrel, amely értéksorozatot ad vissza. Ebben az esetben a metódusnak egy típusgyűjteményt IEnumerable<T>kell visszaadnia. Ilyen módszerekkel szűrőket vagy adatátalakításokat alkalmazhat értékek sorozatára.

Az alábbi példa bemutatja, hogyan hozhat létre egy olyan bővítménymetódust, AlternateElements amely egy gyűjtemény minden más elemét visszaadja az első elemtől kezdve.

' Extension method for the IEnumerable(of T) interface.
' The method returns every other element of a sequence.
<Extension()>
Iterator Function AlternateElements(Of T)(
ByVal source As IEnumerable(Of T)
) As IEnumerable(Of T)
    Dim i = 0
    For Each element In source
        If (i Mod 2 = 0) Then
            Yield element
        End If
        i = i + 1
    Next
End Function

Ezt a bővítménymetódust bármilyen számbavehető gyűjteményhez ugyanúgy hívhatja meg, ahogyan más metódusokat is a IEnumerable<T> felületről, ahogy az alábbi kódban látható:

Dim strings() As String = {"a", "b", "c", "d", "e"}

Dim query5 = strings.AlternateElements()

For Each element In query5
    Console.WriteLine(element)
Next

' This code produces the following output:
'
' a
' c
' e

Lásd még