Bagikan melalui


Cara: Menambahkan metode kustom untuk kueri LINQ (Visual Basic)

Anda memperluas serangkaian metode yang Anda gunakan untuk kueri LINQ dengan menambahkan metode ekstensi ke IEnumerable<T> antarmuka. Misalnya, selain operasi rata-rata standar atau maksimum, Anda membuat metode agregat kustom untuk menghitung satu nilai dari urutan nilai. Anda juga membuat metode yang berfungsi sebagai filter kustom atau transformasi data tertentu untuk urutan nilai dan mengembalikan urutan baru. Contoh metode tersebut adalah Distinct, , Skipdan Reverse.

Saat memperluas IEnumerable<T> antarmuka, Anda dapat menerapkan metode kustom ke koleksi yang dapat dijumlahkan. Untuk informasi selengkapnya, lihat Metode Ekstensi.

Menambahkan metode agregat

Metode agregat menghitung satu nilai dari sekumpulan nilai. LINQ menyediakan beberapa metode agregat, termasuk Average, , Mindan Max. Anda dapat membuat metode agregat Anda sendiri dengan menambahkan metode ekstensi ke IEnumerable<T> antarmuka.

Contoh kode berikut menunjukkan cara membuat metode ekstensi yang dipanggil Median untuk menghitung median untuk urutan jumlah jenis double.

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

Anda memanggil metode ekstensi ini untuk koleksi yang dapat dijumlahkan dengan cara yang sama seperti Anda memanggil metode agregat lain dari IEnumerable<T> antarmuka.

Nota

Di Visual Basic, Anda bisa menggunakan panggilan metode atau sintaks kueri standar untuk klausa Aggregate atau Group By. Untuk informasi selengkapnya, lihat Klausul Agregat dan Klausul Grup Berdasarkan.

Contoh kode berikut menunjukkan cara menggunakan Median metode untuk array jenis 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

Kelebihan beban metode agregat untuk menerima berbagai jenis

Anda dapat membebani metode agregat Anda sehingga menerima urutan berbagai jenis. Pendekatan standar adalah membuat kelebihan beban untuk setiap jenis. Pendekatan lain adalah membuat kelebihan beban yang akan mengambil jenis generik dan mengonversinya ke jenis tertentu dengan menggunakan delegasi. Anda juga dapat menggabungkan kedua pendekatan.

Untuk membuat kelebihan beban untuk setiap jenis

Anda dapat membuat kelebihan beban tertentu untuk setiap jenis yang ingin Anda dukung. Contoh kode berikut menunjukkan overloading dari metode Median untuk tipe integer.

' 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

Anda sekarang dapat memanggil Median overload untuk tipe integer dan double, seperti ditunjukkan dalam kode berikut:

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

Untuk membuat kelebihan beban umum

Anda juga dapat membuat kelebihan beban yang menerima urutan objek generik. Kelebihan beban ini mengambil delegasi sebagai parameter dan menggunakannya untuk mengonversi urutan objek dari jenis generik ke jenis tertentu.

Kode berikut menunjukkan kelebihan beban Median metode yang mengambil Func<T,TResult> delegasi sebagai parameter. Delegasi ini mengambil objek jenis T generik dan mengembalikan objek jenis double.

' 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

Anda sekarang dapat memanggil Median metode untuk urutan objek dari jenis apa pun. Jika jenis tidak memiliki kelebihan beban metodenya sendiri, Anda harus meneruskan parameter delegasi. Di Visual Basic, Anda dapat menggunakan ekspresi lambda untuk tujuan ini. Selain itu, jika Anda menggunakan klausul Aggregate atau Group By daripada panggilan metode, Anda dapat meneruskan nilai atau ekspresi apa pun yang ada dalam cakupan klausul ini.

Contoh kode berikut menunjukkan cara memanggil Median metode untuk array bilangan bulat dan array string. Untuk string, median untuk panjang string dalam array dihitung. Contoh menunjukkan cara meneruskan Func<T,TResult> parameter delegasi ke Median metode untuk setiap kasus.

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

Menambahkan metode yang mengembalikan koleksi

Anda dapat memperluas IEnumerable<T> antarmuka dengan metode kueri kustom yang mengembalikan urutan nilai. Dalam hal ini, metode harus mengembalikan kumpulan jenis IEnumerable<T>. Metode tersebut dapat digunakan untuk menerapkan filter atau transformasi data ke urutan nilai.

Contoh berikut menunjukkan cara membuat metode ekstensi bernama AlternateElements yang mengembalikan setiap elemen lain dalam koleksi, dimulai dari elemen pertama.

' 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

Anda dapat memanggil metode ekstensi ini untuk koleksi yang dapat dijumlahkan seperti yang akan Anda panggil metode lain dari IEnumerable<T> antarmuka, seperti yang ditunjukkan dalam kode berikut:

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

Lihat juga