Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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