在Best Practices for Using Strings in the .NET Framework中,对于不区分大小写的文件路径,建议使用StringComparison OrdinalIgnoreCase
。 (我们称它为声明A。)
我可以同意这一点,因为我可以在同一目录中创建两个文件:
é.txt
é.txt
它们的文件名不同,第二个文件名由
e
和修饰符组成,因此实际上有两个字母。 (您可以尝试使用复制粘贴。)如果实际上存在不变文化比较(而不是序数比较),NTFS将不允许这些文件,因为在同一篇文章中,他们解释了不变文化
a + ̊ = å
但是在关于
String.ToUpperInvariant()
的文章中有不同的建议:(声明B.)如果需要操作系统标识符的小写或大写版本,例如文件名,命名管道或注册表项,请使用ToLowerInvariant或ToUpperInvariant方法。
我需要创建文件路径集合(实际上是
HashSet
)来检测重复项。因此,如果我在创建地图时遵循语句B,则可能会以误报结尾,因为上述文件名é.txt
和é.txt
将被视为一个。我是否正确理解在MSDN中找到的陈述B具有误导性?还是我错过了什么?我将要建立一个库,最好从一开始就没有已知的错误,因此我只是不想忽略这一点。
更新:
语句B似乎还有一个问题:ToLowerInvariant()不能实际使用。原因(我引用最佳实践文章):
DO: Use ToUpperInvariant rather than ToLowerInvariant when normalizing strings for comparison.
实际原因:There is a small range of characters that do not roundtrip, and going to lowercase will make these characters unavailable.
(source) 最佳答案
当您不区分大小写地比较字符串是否相等时,大写和小写都不正确。在这两种变体中,都有使这一点混乱的字符。
不区分大小写比较字符串的正确方法是使用不敏感的StringComparison
选项之一(您知道)。
区分大小写使用数据结构的正确方法是使用StringComparer.*IgnoreCase
之一。例如:
new HashSet<string>(StringComparer.InvariantCultureIgnoreCase)
在将字符串添加到数据结构之前,请勿将其大写。在任何代码审查中,我都会失败。
如果需要操作系统标识符的小写或大写版本
您不需要诸如此类的东西。此声明不适用于您的情况。