String.Aggregateを自作してみる VB

VB Tips And Sample(HOME)VB.NET再入門

String.Aggregateを自作してみる VB

ジェネリック、デリゲート、拡張メソッドなるものを、
前述のようにとても簡単に(難しい理屈はぬきにして)頭に入れておき、
String.Aggregateを自作してみる。
以下の簡単なサンプルを示す。

	#Region "String.Aggregateを自作してみる。"
		
		Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
			'配列を代入
			Dim mystring1() As String = {"1", "2", "3", "4", "5", "6", "7"}
			
			'自作PrintAggregateを呼び出す。引数に関数を放り込むと言う変わったもの。
			'放り込まれると言ったほうが良いのか?
			’実はこれがデリゲートみたいです。
			'fa As Func(Of String, String, String)
'のfaの処理が[b & a]になっている。 'Function(a, b)のa,bに値が入れられ、[b & a]の処理をするという意味。
Debug.Print(mystring1.PrintAggregate(Function(a, b) b & a)) '実行結果 '7654321 End Sub #End Region Module StringYes <System.Runtime.CompilerServices.Extension()> _ Public Function PrintAggregate(A() As String, fa As Func(Of String, String, String)) As String 'A()はその拡張メソッドを呼び出す任意の実態名で A()に{"1", "2", "3", "4", "5", "6", "7"}が入ってくる 'faと言う関数を、デリゲート関数として作成。 'faの処理は、使う時にテキトーに書いてね、と言うこと。 'Func(Of String, String, String)は、フレームワークで予め書かれたジェネリック+デリゲート関数みたいで、 '文中にPublic Delegate Functionなどは不要。 Dim ret As String = "" Dim x As Integer = 1 Do Until x = A.Length + 1 'fa関数を呼び出して処理する。 'a=A(A.Length - x) 'b=ret 'を代入。 '処理は「b & a」でしたね。 ret = fa(A(A.Length - x), ret) x = x + 1 Loop Return ret End Function End Module
何とか自作できました。
合っているかな?
考察・訂正・詳細は次回に・・・。

考察

A() As String
は、拡張メソッドを思い出そう!
拡張メソッドは
要点はモジュールに定義すること。
<System.Runtime.CompilerServices.Extension()> _を書くこと。
後は、
Public Sub 拡張メソッド名(ByVal その拡張メソッドを呼び出す任意の実態名で、何でも良い AS 拡張する型クラス名,パラメータ,パラメータ,・・・)
実際の処理
End Sub
というものでした。
つまり、
A() As String=ByVal その拡張メソッドを呼び出す任意の実態名で、何でも良い。 AS 拡張する型クラス名。
です。

Debug.Print(mystring1.PrintAggregate(Function(a, b) b & a))
は、一体何?
たぶん、これは
fa=Function(a, b) b & a
と言うことだと思う。
しかし、変数に関数、それも名前のない関数を入れてよいのか?
そんな事、今まで聞いたこと無い。
実はこれは「ラムダ式」と言うものでVB2008から登場してきたものらしい。2010ではSubも放り込める。
なんとも厄介な代物では有りませんか。
泣き言の一つを言ったところで、ま、分かれば簡単?なんだけど、と思えるかな?

では、「fa As Func(Of String, String, String)」の
Func(Of String, String, String)
は、何?
としつこく疑問を追っていくと、「Of String」は、ジェネリックというやつで、使う時にStringと型指定している意味。
残りの、「String, String」は、デリゲート関数の定義で、二つの引数・パラメータを受け取りますよと言う意味。

まとめると、PrintAggregate、又はAggregateは、
と言う、初めて聞く文法を全部使った関数と言えるようだ。
では、こんなややこしい文法を使って実現された「Aggregateメソッド」は素晴らしいのだろうか?
たぶん素晴らしいのだろう
他にも多くの拡張メソッドが定義されているようなので、見ていこうと思います。

VB Tips And Sample(HOME)VB.NET再入門