Я ищу эффективный способ преобразования большого int [] в строку [] строк csv, где каждый csv ограничен максимум 4000 символами. Значения в массиве могут быть любыми от 1 до int.MaxValue.
Вот мой окончательный код:
public static string[] GetCSVsFromArray(int[] array, int csvLimit)
{
List<string> parts = new List<string>();
StringBuilder sb = new StringBuilder();
foreach(int id in array)
{
string intId = id.ToString();
if (sb.Length + intId.Length < csvLimit)
sb.Append(intId).Append(",");
else
{
if (sb.Length > 0)
sb.Length--;
parts.Add(sb.ToString());
sb.Length = 0;
}
}
if(sb.Length>0)
parts.Add(sb.ToString());
return parts.ToArray();
}
Есть ли более эффективный способ сделать это?
Итак, вот что я сейчас использую (мне удалось изменить параметр возврата на тип списка, чтобы сохранить вызов ToArray () в конце):
public static List<string> GetCSVsFromArray(int[] array, int csvLimit)
{
List<string> parts = new List<string>();
StringBuilder sb = new StringBuilder();
foreach(int id in array)
{
string intId = id.ToString();
if (sb.Length + intId.Length < csvLimit)
sb.Append(intId).Append(",");
else
{
if (sb.Length > 0)
sb.Length--;
parts.Add(sb.ToString());
sb.Length = 0;
}
}
if(sb.Length>0)
parts.Add(sb.ToString());
return parts;
}
Результаты производительности:
10 000 000 предметов csv Предел в 4000 символов
- Оригинал: 2887,488мс
- GetIntegerDigitCount: 3105,355мс
- Финал: 2883,587мс
Несмотря на то, что я сохранил только 4 мс, удаляя вызов ToArray () на моей машине разработчика, это, кажется, имеет существенное значение на гораздо более медленной машине (сэкономлено более 200 мс на DELL D620)