Будет ли метод работать корректно при бесконечном input?
Что проверяют
Понимаете ли вы разницу между ленивой и жадной обработкой данных в .NET. Обычно речь о методе, который принимает IEnumerable<T> или поток, и интервьюер ждёт, что вы найдёте места, где метод зависнет или съест всю память. Следом просят переписать его так, чтобы он работал с потоком.
Как отвечать
Сначала уточните, что значит «бесконечный»: генератор с yield return без конца, сетевой поток или файл больше оперативной памяти. Затем пройдите по методу с тремя вопросами:
- материализует ли он данные:
ToList(),ToArray(),Count(),OrderBy,Reverse,Last(),GroupBy,string.Joinчитают всё до конца. На бесконечной последовательности это зависание илиOutOfMemoryException; - умеет ли остановиться:
Where,Select,Take,TakeWhileленивые, аFirstиAnyпрерываются на первом совпадении. Но если совпадения нет, они тоже будут ждать вечно; - растёт ли состояние:
Distinctленивый, но копит все увиденные элементы вHashSet, а накопление вListвнутри цикла рано или поздно упрётся в память.
Для сетевых потоков и больших файлов правильный ответ это построчная или поблочная обработка: StreamReader.ReadLine() в цикле, IAsyncEnumerable<T> с await foreach и CancellationToken, а для передачи между производителем и потребителем Channel.CreateBounded<T>, который даёт обратное давление вместо бесконечной очереди.
Отдельно проверьте двойное перечисление: второй обход IEnumerable перезапустит генератор, а сетевой поток второй раз не прочитать.
Где спотыкаются
Ловят OutOfMemoryException в catch (Exception) и продолжают работу. После такого исключения состояние процесса ненадёжно, лечить нужно накопление, а не последствия.
Забывают про конец ввода. Console.ReadLine() возвращает null, когда ввод закончился, и вызов input.Equals(...) падает с NullReferenceException. Если catch глотает эту ошибку внутри while (true), цикл становится вечным.
Оборачивают Console.ReadLine() в Task.Run ради «асинхронности». Это просто занятый поток из пула, а не асинхронный ввод, и проблему бесконечных данных такой код не решает.