在C#中,我正在寻找字符串内部的索引位置 - 具体来说是换行符(
给定一个带有Windows换行符(
如果我查找
给定一个带有Unix换行符(
\n
)所在的索引位置。给定一个带有Windows换行符(
\r\n
)的字符串:如果我查找
"\n"
,它会返回-1。如果我查找"\r\n"
,我得到一个结果。如果我将'\n'
作为字符查找,则会得到一个结果。给定一个带有Unix换行符(
\n
)的字符串,我会得到一个结果。string s = "hello\r\nworld";
Console.WriteLine(@"\r\n index: " + s.IndexOf("\r\n")); // 5
Console.WriteLine(@"\n index as string: " + s.IndexOf("\n")); // -1
Console.WriteLine(@"\n index as char: " + s.IndexOf('\n')); // 6
s = "hello\nworld";
Console.WriteLine(@"\n index as string: " + s.IndexOf("\n")); // 5
Console.WriteLine(@"\n index as char: " + s.IndexOf('\n')); // 5
我知道换行符占两个字符,如果我使用StreamReader,File.ReadAllLines或类似的东西,那么它会被自动处理并且我会失去它们。
我以为\n
本身就是一个有效的字符串,而\r\n
虽然很特别,但在字符串中仍表示为两个不同的字符。但这告诉我另外一种情况。
我可以对字符进行IndexOf操作而不是字符串('\n'
而不是"\n"
),但我真的想知道为什么会发生这种情况,以便我可以计划它。
编辑
提示:刚刚发现将字符串转换为Span
可得到正确的结果。不确定其中涉及的开销,因此不知道与Ordinal解决方案相比如何-我猜Ordinal是更好的解决方案:
Console.WriteLine(@"\n index as string Ordinal: "
+ s.IndexOf("\n", StringComparison.Ordinal)); // 6
Console.WriteLine(@"\n index as Span: "
+ s.AsSpan().IndexOf("\n".AsSpan())); // 6
Console.WriteLine(@"\n index as string with s.AsSpan(): "
+ s.AsSpan().IndexOf("\n")); // 6