If you are stuck on .net 2.0 and want to have similar functionality without being able to monkey in LINQ, here is an implementation of similar array splicing. Probably could be tuned a bit faster but it should be flexible enough to handle any kind of array in vb.net:
Usage:
Dim a as New Integer(){0,1,2,3,4,5,6}
Dim a2 as Integer() = (New ArraySlicer(a)).skip(2).take(3).arr())
a2 = [2, 3, 4]
Code:
Public Class ArraySlicer
Private _a as Object()
Private _t as Type
Private _l as Integer
Public Sub New(ByVal o As Object, ByVal Optional t as Type = Nothing)
if t is Nothing then
Me._t = o.getType()
if not Me._t.isArray then throw new Exception("Parameter o can only be an Array. Type passed is " & Me._t.FullName)
else
Me._t = t
end if
Me._l = o.length
Me._a = _copy(new Object(Me._l-1){}, o)
End Sub
Public Function skip(ByVal nskip as Integer) as ArraySlicer
if nskip > Me._l then return new ArraySlicer(new Object(){}, Me._t)
Dim a as Object() = new Object(Me._l - nskip - 1){}
for i as Integer = nskip to Me._l - 1
a(i - nskip) = Me._a(i)
next
return new ArraySlicer(a, Me._t)
End Function
Public Function take(ByVal ntake as Integer) as ArraySlicer
if ntake > Me._l then return Me
Dim a as Object() = new Object(ntake-1){}
for i as Integer = 0 to ntake - 1
a(i) = Me._a(i)
next
return new ArraySlicer(a, Me._t)
End Function
Private Function _copy(ByRef o1 as Object, o2 as Object)
for i as Integer = 0 to Me._l - 1
o1(i) = o2(i)
next
return o1
End Function
Public Function arr() as Object
Dim sT as String = Me._t.FullName
if sT = "System.Int32[]" then
return _copy(new Int32(Me._l-1){}, Me._a)
elseif sT = "System.String[]" then
return _copy(new String(Me._l-1){}, Me._a)
elseif sT = "System.Boolean[]" then
return _copy(new Boolean(Me._l-1){}, Me._a)
elseif sT = "System.Byte[]" then
return _copy(new Byte(Me._l-1){}, Me._a)
elseif sT = "System.Char[]" then
return _copy(new Char(Me._l-1){}, Me._a)
elseif sT = "System.Decimal[]" then
return _copy(new Decimal(Me._l-1){}, Me._a)
elseif sT = "System.Double[]" then
return _copy(new Double(Me._l-1){}, Me._a)
elseif sT = "System.Int16[]" then
return _copy(new Int16(Me._l-1){}, Me._a)
elseif sT = "System.Int64[]" then
return _copy(new Int64(Me._l-1){}, Me._a)
elseif sT = "System.Single[]" then
return _copy(new Single(Me._l-1){}, Me._a)
elseif sT = "System.SByte[]" then
return _copy(new SByte(Me._l-1){}, Me._a)
elseif sT = "System.UInt16[]" then
return _copy(new UInt16(Me._l-1){}, Me._a)
elseif sT = "System.UInt32[]" then
return _copy(new UInt32(Me._l-1){}, Me._a)
elseif sT = "System.UInt64[]" then
return _copy(new UInt64(Me._l-1){}, Me._a)
elseif sT = "System.Object[]" then
return _copy(new Object(Me._l-1){}, Me._a)
else
return Me._a
end if
end Function
end class