Это потому, что на каждой итерации за кулисами вы создаете 2 строки, и они приближаются к концу.
"1,2,3,4,5, .... 499500"
"1,2,3,4,5, .... 499500,"
в конце только 500 итераций вы создаете 2 строки длиной почти 2000 символов, чтобы исключить их на следующей итерации (но среда выполнения может их не использовать).
На последней итерации ваша строка (от 1 до 50000) будет иметь длину 100 000 символов, при условии, что ваши индексы строк даже последовательны. Это означает, что вы выделили ~ 10 000 000 000 символов или (я считаю, 2 байта / символ) 20 гигабайт строк.
Вы можете начать с использования StringBuilder
вместо +=
в строке (RowString).
Ex
Dim RowString As StringBuilder = new StringBuilder( 100000 )
For Each Row In RowIndexes
RowString.Append( CInt(Row.ToString) + 1).Append( "," )
Next
'...'
Return RowString.ToString
Вы также можете попробовать следующий, но вам следует профилировать два и выбрать лучшее для вас.
Private Function GetCommaSeperatedString(ByRef RowIndexes As ArrayList) As String
Dim indexArray as String[] = RowIndexes
.Select(Function(r)=> (CInt(r.ToString) + 1)ToString)
.ToArray
return String.Join( ',', indexArray)
End Function
* примечание: это первые строки VB, которые я когда-либо писал, поэтому я, возможно, допустил основную ошибку (особенно в материале linq / lambda), но суть в этом.