Java掃描程序有一個next()
方法,它從流中讀取下一個標記,其中標記由分隔符分隔(缺省情況下,分隔符是任何空格字符,包括製表符和新行)。如何在C#流中模擬Java Scanner的next()方法?
如何用C#/ .NET做到這一點? C#中的流有Read()
和ReadLine()
,但它們沒有空白或自定義分隔符的概念。我可以讀整行,然後使用字符串的Split()
方法,但這意味着我必須先讀取整個字符串(而不是next()
,它只讀取下一個標記)。
Java掃描程序有一個next()
方法,它從流中讀取下一個標記,其中標記由分隔符分隔(缺省情況下,分隔符是任何空格字符,包括製表符和新行)。如何在C#流中模擬Java Scanner的next()方法?
如何用C#/ .NET做到這一點? C#中的流有Read()
和ReadLine()
,但它們沒有空白或自定義分隔符的概念。我可以讀整行,然後使用字符串的Split()
方法,但這意味着我必須先讀取整個字符串(而不是next()
,它只讀取下一個標記)。
那麼,你可能一次讀取一個字符,並檢查它是否符合分隔符。我認爲StreamReader
總是保留一個緩衝區,所以它不應該有太多的性能成本(即每次讀取字符時都不會碰到磁盤)。您可以保留「迄今爲止的令牌」的StringBuilder
並繼續前進,直到您達到分隔符爲止,此時您返回該令牌。
另外,出於性能方面的原因,您可以一次讀取塊,並掃描查找分隔符的字符數組,然後在找到該字符串時創建該字符串。保持狀態一致將比使用StringBuilder
並一次閱讀一個字符更加棘手,但如果這對性能至關重要,那麼它可能是值得的。
我不會試圖效仿全部什麼Scanner
做 - 只是寫你需要的位。您可能需要考慮使用迭代器塊來實現此操作爲IEnumerable<string>
以方便起見。您可能想要傳入Func<TextReader>
而不是TextReader
本身,以便迭代器塊可以正確關閉閱讀器。