Cara: Menambahkan metode kustom untuk kueri LINQ (Visual Basic)
Anda memperluas set metode yang Anda gunakan untuk kueri LINQ dengan menambahkan metode ekstensi ke antarmuka IEnumerable<T>. Misalnya, selain operasi rata-rata standar atau maksimum, Anda membuat metode agregat kustom untuk mengomputasi satu nilai dari urutan nilai. Anda juga membuat metode yang berfungsi sebagai filter kustom atau transformasi data tertentu untuk urutan nilai dan menampilkan urutan baru. Contoh metode tersebut adalah Distinct, Skip, dan Reverse.
Ketika memperluas antarmuka IEnumerable<T>, Anda dapat menerapkan metode kustom ke koleksi apa pun yang dapat dijumlahkan. Untuk informasi selengkapnya, lihat Metode Ekstensi.
Penambahan metode agregat
Metode agregat mengomputasi satu nilai dari set nilai. LINQ menyediakan beberapa metode agregat, termasuk Average, Min, dan Max. Anda dapat membuat metode agregat sendiri dengan menambahkan metode ekstensi ke antarmuka IEnumerable<T>.
Contoh kode berikut menunjukkan cara membuat metode ekstensi yang disebut Median
untuk mengomputasi 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 apa pun yang dapat dijumlahkan dengan cara yang sama seperti Anda memanggil metode agregat lain dari antarmuka IEnumerable<T>.
Catatan
Dalam Visual Basic, Anda dapat menggunakan panggilan metode atau sintaksis kueri standar untuk klausul Aggregate
atau Group By
. Untuk informasi selengkapnya, lihat Klausul Agregat dan Kelompokkan Menurut Klausul.
Contoh kode berikut menunjukkan cara menggunakan metode Median
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
Pembebanan metode agregat untuk menerima berbagai jenis
Anda dapat melebihkan beban metode agregat Anda sehingga metode tersebut menerima urutan berbagai jenis. Pendekatan standarnya adalah untuk membuat kelebihan beban bagi 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 tersebut.
Untuk membuat kelebihan beban bagi setiap jenis
Anda dapat membuat kelebihan beban tertentu untuk setiap jenis yang ingin Anda dukung. Contoh kode berikut menunjukkan kelebihan beban metode Median
untuk jenis 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
Sekarang Anda dapat memanggil kelebihan beban Median
untuk jenis integer
dan double
, seperti yang 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 generik
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 menjadi jenis tertentu.
Kode berikut menunjukkan beban lebih metode Median
yang mengambil delegasi Func<T,TResult> sebagai parameter. Delegasi ini mengambil objek jenis generik T
dan menampilkan 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 metode Median
untuk urutan objek dari jenis apa pun. Jika jenis tidak memiliki kelebihan beban metodenya sendiri, Anda harus meneruskan parameter delegasi. Dalam Visual Basic, Anda dapat menggunakan ekspresi lambda untuk tujuan ini. Selain itu, jika Anda menggunakan klausul Aggregate
atau Group By
alih-alih panggilan metode, Anda dapat meneruskan nilai atau ekspresi yang ada dalam cakupan klausul ini.
Contoh kode berikut menunjukkan cara memanggil metode Median
untuk array integer dan array string. Untuk string, median panjang string dalam array akan dihitung. Contoh ini menunjukkan cara meneruskan parameter delegasi Func<T,TResult> ke metode Median
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
Penambahan metode yang menampilkan koleksi
Anda dapat memperluas antarmuka IEnumerable<T> dengan metode kueri kustom yang mengembalikan urutan nilai. Dalam hal ini, metode harus menampilkan koleksi 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 menampilkan setiap elemen lain dalam koleksi, mulai 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 apa pun yang dapat dijumlahkan sama seperti saat Anda memanggil metode lain dari antarmuka IEnumerable<T>, sebagaimana 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