索引和序号字符串比较
本文关键字:字符串 比较 索引 | 更新日期: 2023-09-27 18:34:15
我的问题是 String.IndexOf 返回-1
.我希望它能返回0
.
参数:
text
= C:''Users''User''Desktop''Sync''̼
(注意下面的组合海鸥字符(
stringToTrim
= C:''Users''User''Desktop''Sync''
当我使用 int index = text.IndexOf(stringToTrim);
检查索引时,index
的值是 -1
。我发现使用序数字符串比较解决了我的这个问题:
int index = text.IndexOf(stringToTrim, StringComparison.Ordinal);
在线阅读,许多 Unicode 字符(如 U+00B5 和 U+03BC(映射到同一个符号,因此最好对此进行扩展并规范化两个字符串:
int index = text.Normalize(NormalizationForm.FormKD).IndexOf(stringToTrim.Normalize(NormalizationForm.FormKD), StringComparison.Ordinal);
这是检查一个字符串在哪个索引处包含另一个字符串的所有连续字符的正确方法吗?所以这个想法是,当你想检查符号是否匹配时,你规范化,但当你想通过字符的编码值检查字符时,你不规范化(因此允许重复的符号(?另外,有人可以解释为什么int index = text.IndexOf(stringToTrim);
在字符串的开头找不到匹配项吗?换句话说,它在幕后到底在做什么?我本来希望它从字符串的开头到字符串的末尾开始搜索字符。
这种行为对我来说非常有意义。您正在使用与前面的字符组合的组合字符,将其转换为不同的字符,该字符与您在搜索字符串末尾指定的''''
字符不匹配。这样可以防止找到您要查找的整个字符串。如果你寻找"C:''Users''User''Desktop''Sync"
,它就会找到它。
使用 StringComparison.Ordinal
会告诉 .NET 忽略字符的各种规则,只查看其确切的序号值。这似乎做了你想做的事,所以是的......这是你应该做的。
"正确的方法"完全取决于你想要什么行为。许多字符串操作涉及向用户呈现或由用户提供的文本,应以区域性感知和 Unicode 感知方式完成。其他时候,这是不可取的。选择适合您需求的正确方法非常重要。
,您应该使用 StringComparison.Ordinal
来保证在比较值时忽略区域性。对于"默认情况下"被视为区域性不变的所有字符串,这是特别必要的。这包括文件路径。
不使用 StringComparison.Ordinal
( 时,可能会引入细微的错误:http://msdn.microsoft.com/en-us/library/dd465121(v=vs.110(.aspx
当文化上独立的字符串数据(如 XML 标记、HTML 标记、 用户名、文件路径和系统对象的名称是 应用程序代码被解释为区分区域性,可以 受到细微错误、性能不佳以及某些情况下安全性的影响 问题。
StringComparison.Ordinal
的一些附带好处是更好的性能:http://msdn.microsoft.com/en-us/library/ms973919.aspx