2011-05-28 23 views
3

Java掃描程序有一個next()方法,它從流中讀取下一個標記,其中標記由分隔符分隔(缺省情況下,分隔符是任何空格字符,包括製表符和新行)。如何在C#流中模擬Java Scanner的next()方法?

如何用C#/ .NET做到這一點? C#中的流有Read()ReadLine(),但它們沒有空白或自定義分隔符的概念。我可以讀整行,然後使用字符串的Split()方法,但這意味着我必須先讀取整個字符串(而不是next(),它只讀取下一個標記)。

回答

4

那麼,你可能一次讀取一個字符,並檢查它是否符合分隔符。我認爲StreamReader總是保留一個緩衝區,所以它不應該有太多的性能成本(即每次讀取字符時都不會碰到磁盤)。您可以保留「迄今爲止的令牌」的StringBuilder並繼續前進,直到您達到分隔符爲止,此時您返回該令牌。

另外,出於性能方面的原因,您可以一次讀取塊,並掃描查找分隔符的字符數組,然後在找到該字符串時創建該字符串。保持狀態一致將比使用StringBuilder並一次閱讀一個字符更加棘手,但如果這對性能至關重要,那麼它可能是值得的。

我不會試圖效仿全部什麼Scanner做 - 只是寫你需要的位。您可能需要考慮使用迭代器塊來實現此操作爲IEnumerable<string>以方便起見。您可能想要傳入Func<TextReader>而不是TextReader本身,以便迭代器塊可以正確關閉閱讀器。