Java Scanner有一个next()
方法,它从流中读取下一个令牌,其中令牌是由分隔符分隔的东西(默认情况下,分隔符是任何空白字符,包括制表符和新行)。
如何使用C#/来完成此操作。NET?C#中的流有Read()
和ReadLine()
,但它们没有空格或自定义分隔符的概念。我可以读取整行,然后使用字符串的Split()
方法,但这意味着我必须首先读取整行字符串(而next()
只读取下一个令牌)。
好吧,可以一次读取一个字符,并检查它是否与分隔符匹配。我相信StreamReader
无论如何都有一个缓冲区,所以它不应该有太多的性能成本(也就是说,每次读取字符时它不会碰到磁盘)。您可以只保留"到目前为止的令牌"的StringBuilder
,并一直保持下去,直到您达到分隔符为止,此时您将返回令牌。
或者,出于性能原因,您可以一次读取一个区块,然后扫描字符数组寻找分隔符,然后在找到它时构建字符串。保持状态一致将比只使用StringBuilder
一次读取字符要困难得多,但如果这对性能至关重要,那么这可能是值得的。
我不会试图模仿Scanner
所做的所有,只需编写您需要的位即可。为了方便起见,您可能需要考虑使用迭代器块将其实现为IEnumerable<string>
。您可能希望传入Func<TextReader>
,而不是TextReader
本身,这样迭代器块就可以适当地关闭读取器。