Как смоделировать метод next () Java Scanner в потоке C #? - PullRequest
3 голосов
/ 28 мая 2011

Java Scanner имеет метод next(), который считывает следующий токен из потока, где токен является чем-то, отделенным разделителями (по умолчанию разделителем является любой символ пробела, включая символ табуляции и новую строку ).

Как я могу сделать это с C # / .NET? Поток в C # имеет Read() и ReadLine(), но у них нет понятия пробела или пользовательского разделителя. Я могу прочитать всю строку, а затем использовать метод Split() для строки, но это означает, что мне нужно сначала прочитать всю строку (в отличие от next(), который читает только следующий токен).

1 Ответ

4 голосов
/ 28 мая 2011

Ну, вы могли бы прочитать символ за раз и проверить, соответствует ли он разделителю. Я считаю, что StreamReader в любом случае сохраняет буфер, поэтому он не должен иметь больших затрат производительности (то есть он не будет попадать на диск каждый раз, когда вы читаете символ). Вы можете просто сохранить StringBuilder «токена до сих пор» и продолжать идти, пока не достигнете разделителя, после чего вы вернете токен.

В качестве альтернативы, из соображений производительности, вы можете читать порцию за раз и сканировать массив символов в поисках разделителя, а затем построить строку, когда найдете ее. Поддерживать согласованное состояние будет значительно сложнее, чем просто использовать StringBuilder и читать символ за раз, но если это критично для производительности, то это может стоить того.

Я бы не пытался эмулировать все того, что делает Scanner - просто напишите нужные вам биты. Возможно, вы захотите реализовать это как IEnumerable<string> с использованием блоков итераторов для удобства. Возможно, вы захотите передать Func<TextReader>, а не сам TextReader, чтобы блок итератора мог соответствующим образом закрыть читатель.

...