【发布时间】:2011-02-14 03:27:35
【问题描述】:
我无法确定字符串是否为换行符。我使用的字符串是从 Ultraedit 使用 DOS Terminators CR/LF 写入的文件中读取的。我认为这将等同于 C# 中的 "\r\n" 或 Environment.NewLine。但是,当我执行这样的比较时,它似乎总是返回 false:
if(str==Environment.NewLine)
有人知道这里发生了什么吗?
【问题讨论】:
我无法确定字符串是否为换行符。我使用的字符串是从 Ultraedit 使用 DOS Terminators CR/LF 写入的文件中读取的。我认为这将等同于 C# 中的 "\r\n" 或 Environment.NewLine。但是,当我执行这样的比较时,它似乎总是返回 false:
if(str==Environment.NewLine)
有人知道这里发生了什么吗?
【问题讨论】:
如何读取这些行?如果您使用 StreamReader.ReadLine(或类似的东西),新行字符将不会出现在结果字符串中 - 它将是 String.Empty 或(即“”)。
【讨论】:
你确定整个字符串只包含一个 NewLine 而没有更多或更少吗?您是否已经尝试过str.Contains(Environment.NewLine)?
【讨论】:
最明显的故障排除步骤是检查 str 的实际值是多少。只需在调试器中查看或打印出来。
【讨论】:
换行符是“\r\n”,而不是“/r/n”。也许不仅仅是换行符......调试模式下的字符串值是什么?
您可以使用新的 .NET 4.0 方法: String.IsNullOrWhiteSpace
【讨论】:
这是一个非常有效的问题。
这就是答案。我发明了一种可以处理它的杂物。
static bool StringIsNewLine(string s)
{
return (!string.IsNullOrEmpty(s)) &&
(!string.IsNullOrWhiteSpace(s)) &&
(((s.Length == 1) && (s[0] == 8203)) ||
((s.Length == 2) && (s[0] == 8203) && (s[1] == 8203)));
}
像这样使用它:
foreach (var line in linesOfMyFile)
{
if (StringIsNewLine(line)
{
// Ignore reading new lines
continue;
}
// Do the stuff only for non-empty lines
...
}
【讨论】: