如何在 C# 流中模拟 Java Scanner 的 next() 方法?



Java Scanner有一个next()方法,它从流中读取下一个令牌,其中令牌是由分隔符分隔的东西(默认情况下,分隔符是任何空白字符,包括制表符和新行)。

如何使用C#/来完成此操作。NET?C#中的流有Read()ReadLine(),但它们没有空格或自定义分隔符的概念。我可以读取整行,然后使用字符串的Split()方法,但这意味着我必须首先读取整行字符串(而next()只读取下一个令牌)。

好吧,可以一次读取一个字符,并检查它是否与分隔符匹配。我相信StreamReader无论如何都有一个缓冲区,所以它不应该有太多的性能成本(也就是说,每次读取字符时它不会碰到磁盘)。您可以只保留"到目前为止的令牌"的StringBuilder,并一直保持下去,直到您达到分隔符为止,此时您将返回令牌。

或者,出于性能原因,您可以一次读取一个区块,然后扫描字符数组寻找分隔符,然后在找到它时构建字符串。保持状态一致将比只使用StringBuilder一次读取字符要困难得多,但如果这对性能至关重要,那么这可能是值得的。

我不会试图模仿Scanner所做的所有,只需编写您需要的位即可。为了方便起见,您可能需要考虑使用迭代器块将其实现为IEnumerable<string>。您可能希望传入Func<TextReader>,而不是TextReader本身,这样迭代器块就可以适当地关闭读取器。

相关内容

  • 没有找到相关文章

最新更新