|
■No19852 (jiioi さん) に返信
> 匿名メソッドが出てきてどうしても変換方法がわかりませんでした。
VB には匿名メソッドが無いですからね。
で、C# の場合、匿名メソッドが IL へとコンパイル際には、一時的なクラスが
作成され、そのメソッドをデリゲートとしているようです。それを模倣したのが、先のコード。
>> static void AddToList<T>(int iSubStart, int iSubEnd, T[] array, List<T[]> list) { … }
>>のようなメソッドを作っておいて、ループ中で
>> AddToList<T>( iStart, i, array, list );
>>としておいても良いような。
> みなさん、同じことをおっしゃっているとおもいますが、実際VBで組むにはどのようにしたらよいでしょう。
まずは C# で組むと、こう。
public abstract class Arraylib
{
// 元々は、匿名メソッドにしていた部分
private static void AddToList<T>(int iSubStart, int iSubEnd, T[] array, List<T[]> list)
{
int subcnt = iSubEnd - iSubStart;
T[] arraySub = new T[subcnt];
Array.Copy( array, iSubStart, arraySub, 0, subcnt );
list.Add( arraySub );
}
public static T[][] Split<T>( T[] array, DSearchArray<T> delimit )
{
// 部分配列のリスト
System.Collections.Generic.List<T[]> list = new System.Collections.Generic.List<T[]>();
bool hasData = false;
int iStart = -1;
// ソース配列を走査する
for( int i = 0; i < array.Length; i++ )
{
…略…
// 部分配列を抜き出してリストに追加する
/*
addToList( iStart, i ); // 匿名メソッドの呼び出し
*/
AddToList<T>( iStart, i, array, list );
…略…
}
…略…
return list.ToArray();
}
}
それを VB 化すると、こうかな。
Private Shared Sub AddToList(Of T)(iSubStart%, iSubEnd%, array() As T, list As List(Of T()) )
Dim subcnt As Integer = iSubEnd - iSubStart
Dim arraySub(subcnt - 1) As T
Array.Copy(tArray, iSubStart, arraySub, 0, subcnt)
tList.Add(arraySub)
End Sub
Public Shared Function Split(Of T)(ByVal array As T(), ByVal delimit As DSearchArray(Of T)) As T()()
Dim list As New System.Collections.Generic.List(Of T())()
Dim hasData As Boolean = False
Dim iStart As Integer = -1
For i As Integer = 0 To array.Length - 1
…略…
' 部分配列を抜き出してリストに追加する
'' addToList.Invoke(iStart, i)
AddToList(Of T)( iStart, i, array, list )
…略…
Next
…略…
Return list.ToArray()
End Function
|