如何在 C# 流中模拟 Java Scanner 的 next() 方法?
Posted
技术标签:
【中文标题】如何在 C# 流中模拟 Java Scanner 的 next() 方法?【英文标题】:How to simulate Java Scanner's next() method in C# stream? 【发布时间】:2011-09-03 21:36:18 【问题描述】:Java Scanner 有一个next()
方法,它从流中读取下一个标记,其中标记是由分隔符分隔的东西(默认情况下,分隔符是任何空白字符,包括制表符和换行符)。
如何使用 C#/.NET 做到这一点? C# 中的流具有Read()
和ReadLine()
,但它们没有空格或自定义分隔符的概念。我可以读取整行,然后使用字符串的Split()
方法,但这意味着我必须先读取整个字符串(而不是next()
,它只读取下一个标记)。
【问题讨论】:
【参考方案1】:好吧,您可以一次读取一个字符,然后检查它是否与分隔符匹配。我相信StreamReader
无论如何都会保留一个缓冲区,因此它不应该有太多的性能成本(即每次读取字符时它都不会撞击磁盘)。您可以只保留“到目前为止的令牌”的StringBuilder
并继续前进,直到您遇到分隔符,此时您返回令牌。
或者,出于性能原因,您可以一次读取一个块,并扫描字符数组以查找分隔符,然后在找到它时构建字符串。保持状态一致将比仅使用 StringBuilder
并一次读取一个字符要复杂得多,但如果这对性能至关重要,那么它可能是值得的。
我不会尝试模仿Scanner
所做的所有 - 只需编写您需要的位即可。为方便起见,您可能需要考虑使用迭代器块将其实现为IEnumerable<string>
。您可能希望传入 Func<TextReader>
而不是 TextReader
本身,以便迭代器块可以适当地关闭阅读器。
【讨论】:
以上是关于如何在 C# 流中模拟 Java Scanner 的 next() 方法?的主要内容,如果未能解决你的问题,请参考以下文章