IndexOf和序数字符串比较

Ale*_*dru 8 c# string unicode culture indexof

我的问题是String.IndexOf返回-1.我希望它会回归0.

参数:

text= C:\\Users\\User\\Desktop\\Sync\\?(注意组合海鸥下面的字符)

stringToTrim = C:\\Users\\User\\Desktop\\Sync\\

当我检查索引时,使用is int index = text.IndexOf(stringToTrim);的值.我发现使用序数字符串比较解决了我的这个问题:index-1

int index = text.IndexOf(stringToTrim, StringComparison.Ordinal);
Run Code Online (Sandbox Code Playgroud)

在线阅读,很多Unicode字符(如U + 00B5U + 03BC)映射到相同的符号,因此最好扩展它并规范化两个字符串:

int index = text.Normalize(NormalizationForm.FormKD).IndexOf(stringToTrim.Normalize(NormalizationForm.FormKD), StringComparison.Ordinal);
Run Code Online (Sandbox Code Playgroud)

这是检查一个字符串包含另一个字符串的所有连续字符的索引的正确方法吗?所以我们的想法是,当你想要检查符号是否匹配时,你会规范化,但是当你想通过它们的编码值检查字符时你不规范化(因此允许重复的符号)?此外,有人可以解释为什么int index = text.IndexOf(stringToTrim);在字符串的开头找不到匹配?换句话说,它实际上是在做什么呢?我本来期望它开始从字符串的开头到字符串的结尾搜索字符.

Pet*_*iho 6

这种行为对我来说非常有意义.您正在使用组合字符,该字符与前面的字符组合,将其转换为不同的字符,该'\\'字符与您在搜索字符串末尾指定的字符不匹配.这可以防止找到您正在寻找的整个字符串.如果你寻找"C:\\Users\\User\\Desktop\\Sync",它会发现它.

使用StringComparison.Ordinal告诉.NET忽略字符的各种规则,只查看它们的确切序数值.这似乎做你想要的,所以是的......这就是你应该做的.

"正确的方法"完全取决于你想要的行为.许多字符串操作涉及向用户呈现或提供的文本,并且应该以文化感知和Unicode感知的方式完成.其他时候,这是不可取的.根据您的需求选择正确的方法非常重要.