【发布时间】:2010-02-06 23:28:57
【问题描述】:
我有一个字符串,我想逐行读取,但我还需要有行分隔符,不幸的是 StringReader.ReadLine 会修剪(与保存它的 ruby 不同)。完成此任务的最快、最稳健的方法是什么?
我一直在考虑的替代方案:
- 逐个字符读取输入并每次检查行分隔符
- 使用 RegExp.Split 进行正向预测
或者我只关心行分隔符,因为我需要知道字符串中的实际位置,并且分隔符可以是一个字符或一个字符长。因此,如果我能找回光标在字符串中的实际位置也不错,但 StringReader 没有这个功能。
编辑:这是我当前的实现。通过返回一个空字符串来指定文件结束。
StringBuilder line = new StringBuilder();
int r = _input.Read();
while (r >= 0)
{
char c = Convert.ToChar(r);
line.Append(c);
if (c == '\n') break;
if (c == '\r')
{
int peek = _input.Peek();
if (peek == -1) break;
if (Convert.ToChar(peek) != '\n') break;
}
r = _input.Read();
}
return line.ToString();
【问题讨论】:
-
我的答案可能还有另一种选择,但这取决于数据的来源:它是某种流,还是源只是一个普通字符串?
-
我确信它们会不一致,并且我无法更改输入,这被认为是只读的(克隆字符串并更改不会这样做,因为我需要其中的字符位置原始字符串)。然而,输入是一个纯字符串。
-
在您对下面的 Aaronaught 的评论中,您写道:“设计为与 mono 和 .net2 兼容......因此无法做出任何假设”:您是否对行尾有一些有效的假设可以让这些是您正在解析的字符串的唯一来源吗?
-
@BillW:需要处理的文件将在 Windows 和 Linux 中复制和编辑。也有可能(已经发生在我身上),即使在单个文件中,行尾也会不同。