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)


在将字符串添加到数据结构之前,请勿将其大写。在任何代码审查中,我都会失败。


如果需要操作系统标识符的小写或大写版本


您不需要诸如此类的东西。此声明不适用于您的情况。

07-23 19:44