Pero es que el problema raíz se debe solucionar así...
Quizás yo entiendo mal lo que pretendes hacer o quizás le estás dando el enfoque incorrecto al código puesto que si quieres usar splits(15) entonces debes incrementar la colección 'values'.
Mira, tienes una colección de 18 números:
Dim values As IEnumerable(Of Integer) =
{
1, 2,
3, 4,
5, 6,
10, 11,
14, 15,
54, 57,
58, 60,
63, 64,
65, 67
}
Y la particionas en colecciones de 2 elementos cada una, es decir, un total de 9:
Dim splits As IEnumerable(Of IEnumerable(Of Integer)) =
SplitIntoParts
(collection:
=values, amount:
=2, fillEmpty:
=True)
Desde 'splits(0)' hasta 'splits(8)'.
Pero aquí intentas acceder al índice 15 (splits(15)):
Dim concatCol As IEnumerable(Of Integer) = splits(0).Concat(splits(3).Concat(splits(4).Concat(splits(5).Concat(splits(15)))))
Si antes de partir no rellenas la colección ' values' con ceros o con lo que sea, entonces dime tú cómo vas a pretender acceder a splits(15) cuando cómo bien dices no llega a 15, son 9 (splits(8)),
la colección que vas a partir debería contener 32 números en vez de 18 para así poder llegar a 16 secuencias, a splits(15).
Por cierto, he modificado la función para hacerla más comprensible y le añadí un parámetro adicional (valueToFill):
''' <remarks>
''' *****************************************************************
''' Snippet Title: Split Collection Into Number Of elements
''' Code's Author: Elektro
''' Date Modified: 31-March-2015
''' Usage Example:
''' Dim mainCol As IEnumerable(Of Integer) = {1, 2, 3, 4, 5, 6, 7, 8, 9}
''' Dim splittedCols As IEnumerable(Of IEnumerable(Of Integer)) = SplitIntoNumberOfelements(col:=mainCol, amount:=4, fillEmpty:=True, valueToFill:=0)
''' splittedCols.ToList.ForEach(Sub(col As IEnumerable(Of Integer))
''' Debug.WriteLine(String.Join(", ", col))
''' End Sub)
''' *****************************************************************
''' </remarks>
''' <summary>
''' Splits an <see cref="IEnumerable(Of T)"/> into secuences with the specified amount of elements each one.
''' </summary>
''' <typeparam name="T"></typeparam>
''' <param name="col">The collection to split.</param>
''' <param name="amount">The target elements amount.</param>
''' <param name="fillEmpty">If set to <c>true</c>, generates empty elements to fill the last secuence's part amount.</param>
''' <param name="valueToFill">An optional value used to fill the last secuence's part amount.</param>
''' <returns>IEnumerable(Of IEnumerable(Of T)).</returns>
Public Shared Function SplitIntoNumberOfelements(Of T)(ByVal col As IEnumerable(Of T),
ByVal amount As Integer,
ByVal fillEmpty As Boolean,
Optional valueToFill As T = Nothing) As IEnumerable(Of IEnumerable(Of T))
Return (From count As Integer In Enumerable.Range(0, CInt(Math.Ceiling(col.Count() / amount)))).
Select(Function(count)
Select Case fillEmpty
Case True
If (col.Count - (count * amount)) >= amount Then
Return col.Skip(count * amount).Take(amount)
Else
Return col.Skip(count * amount).Take(amount).
Concat(Enumerable.Repeat(Of T)(
valueToFill,
amount - (col.Count() - (count * amount))))
End If
Case Else
Return col.Skip(count * amount).Take(amount)
End Select
End Function)
End Function