Comments 9
Даже интересно, как стыкуются контексты спортивного программирования, где задачи решаются "на время" и то, сколько этого ценного времени нужно угробить ради максимально тупого и быстрого ввода массива int'ов.
И после этого еще жалуются на C, что он "без батареек".
Нормально стыкуется, ввод массива заучивается наизусть и пишется при необходимости за минуту. А на финале ACM ICPC даже разрешают взять с собой N страниц текста с подобными заготовками (что на самом деле бесполезно поскольку на отборочных соревнованиях этого разрешения нет — а значит все участники и без того помнят свои заготовки наизусть).
Та же хеш-таблица или (упаси боже!) красно-чёрное дерево пишется куда дольше, а потому наличие в стандартной библиотеке их реализаций куда важнее на соревновании чем быстрый ввод целых чисел.
Отличная статья, побольше бы таких подробных на Хабре.
Никогда не сталкивался с массовым вводом массивов на с#.
Указанные проблемы не про консоль вовсе, а про любой парсинг текстовых данных и предложенные решения применимы не только в контексте спортивного програмирования. Сколько там уже итераций "мы ускорили JsonSerializer в сто миллионов раз"?
var result = Console.ReadLine()
.Split(' ', StringSplitOptions.RemoveEmptyEntries)
.Select(int.Parse)
.Sum();
А почему бы не так:
var result = Console.ReadLine()
.Split().Where(s => s != "")
.Select(int.Parse)
.Sum();
?
Зачем изобретать велосипед, если у функции split уже есть готовый параметр? Тем более первое, я уверен, работает быстрее и занимает меньше памяти, так как split возвращает массив сразу без пустых строк
Можно и так, и так.
Проблема в том, что нужно вспомнить в нужный момент об этой особенности функции .Split()
и дописать либо параметр, либо .Where(...)
.
Также при использовании Console.ReadLine().Split()
для формата ввода "в столбик" придётся полностью переписать код. А с поэлементным можно сделать универсальный метод, которому не важен ни тип разделителей, ни их количество:
int[] ReadIntArray()
{
var array = new int[ReadInt()];
for (int i = 0; i < array.Length; ++i)
array[i] = ReadInt();
return array;
}
Быстрый консольный ввод на .NET