Aracılığıyla paylaş


Nasıl yapılır: LINQ sorguları için özel yöntemler ekleme (Visual Basic)

Arabirime uzantı yöntemleri ekleyerek LINQ sorguları için kullandığınız yöntem IEnumerable<T> kümesini genişletirsiniz. Örneğin, standart ortalama veya maksimum işlemlere ek olarak, bir değer dizisinden tek bir değeri hesaplamak için özel bir toplama yöntemi oluşturursunuz. Ayrıca, bir değer dizisi için özel filtre veya belirli bir veri dönüşümü olarak çalışan ve yeni bir sıra döndüren bir yöntem de oluşturursunuz. Bu tür yöntemlere örnek olarak Distinct, Skipve Reverseverilebilir.

Arabirimi IEnumerable<T> genişlettiğinizde, kendi yöntemlerinizi herhangi bir numaralandırılabilir koleksiyona uygulayabilirsiniz. Daha fazla bilgi için bkz . Uzantı Yöntemleri.

Toplama yöntemi ekleme

Toplama yöntemi, bir değer kümesinden tek bir değer hesaplar. LINQ Average, Min, ve Max gibi çeşitli toplama yöntemleri sağlar. Arabirime bir uzantı yöntemi ekleyerek, IEnumerable<T> arabirimine kendi toplama yönteminizi oluşturabilirsiniz.

Aşağıdaki kod örneği, türündeki Medianbir sayı dizisi için ortanca değeri hesaplamak için adlı double bir uzantı yönteminin nasıl oluşturulacağını gösterir.

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

Herhangi bir numaralandırılabilir koleksiyon için bu uzantı yöntemini, arabirimden IEnumerable<T> diğer toplama yöntemlerini çağırdığınız gibi çağırırsınız.

Uyarı

Visual Basic'te, Aggregate veya Group By yan tümcesi için bir yöntem çağrısı veya standart sorgu söz dizimi kullanabilirsiniz. Daha fazla bilgi için bkz. Aggregate Clause ve Group By Clause.

Aşağıdaki kod örneği, Median türünde bir dizi için double yönteminin nasıl kullanılacağını gösterir.

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

Çeşitli türleri kabul etmek için toplama yöntemini aşırı yükleme

Toplama yönteminizi, çeşitli türlerdeki dizileri kabul etmek için aşırı yükleyebilirsiniz. Standart yaklaşım, her tür için bir aşırı yükleme oluşturmaktır. Bir diğer yaklaşım, temsilci kullanarak genel bir türü belirli bir türe dönüştüren bir aşırı yük işlevi oluşturmaktır. Ayrıca her iki yaklaşımı da birleştirebilirsiniz.

Her tür için aşırı yükleme oluşturmak için

Desteklemek istediğiniz her tür için belirli bir aşırı yükleme oluşturabilirsiniz. Aşağıdaki kod örneği, Median türü için integer yönteminin aşırı yüklemesini gösterir.

' 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

Artık aşağıdaki kodda gösterildiği gibi, hem Median hem de integer türleri için double aşırı yüklemelerini çağırabilirsiniz.

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

Genel bir aşırı yükleme oluşturmak için

Ayrıca genel nesnelerin bir dizisini kabul eden bir aşırı yükleme oluşturabilirsiniz. Bu aşırı yükleme bir temsilciyi parametre olarak alır ve bunu kullanarak genel türdeki nesnelerin sırasını belirli bir türe dönüştürür.

Aşağıdaki kod, Median temsilcisini parametre olarak alan Func<T,TResult> yönteminin aşırı yüklemesini gösterir. Bu temsilci genel türde T bir nesne alır ve türünde doublebir nesne döndürür.

' 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

Artık herhangi bir türdeki Median nesne dizisi için yöntemini çağırabilirsiniz. Tür, kendi yöntem aşırı yüklemesine sahip değilse, bir temsilci parametresi geçirmeniz gerekir. Visual Basic'te bu amaçla bir lambda ifadesi kullanabilirsiniz. Ayrıca, yöntem çağrısı yerine Aggregate veya Group By yan tümcesini kullanırsanız, bu yan tümcesinin kapsamındaki herhangi bir değeri veya ifadeyi geçirebilirsiniz.

Aşağıdaki örnek kod, bir tamsayı dizisi ve bir dize dizisi için Median yönteminin nasıl çağrılacağını gösterir. Dizeler için, dizideki dizelerin uzunlukları için ortanca değer hesaplanır. Örnek, her durum için temsilci parametresinin Func<T,TResult> yöntemine Median nasıl geçirileceğini göstermektedir.

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

Koleksiyon döndüren bir yöntem ekleme

Arabirimi, IEnumerable<T> bir değer dizisi döndüren özel bir sorgu yöntemiyle genişletebilirsiniz. Bu durumda, yöntem türünde IEnumerable<T> bir koleksiyon döndürmelidir. Bu tür yöntemler, bir değer dizisine filtre veya veri dönüşümleri uygulamak için kullanılabilir.

Aşağıdaki örnekte, ilk öğeden başlayarak koleksiyondaki diğer tüm öğeleri döndüren adlı AlternateElements bir uzantı yönteminin nasıl oluşturulacağı gösterilmektedir.

' 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

Aşağıdaki kodda gösterildiği gibi, arabirimden IEnumerable<T> diğer yöntemleri çağırdığınız gibi, numaralandırılabilir herhangi bir koleksiyon için bu uzantı yöntemini çağırabilirsiniz:

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

Ayrıca bakınız