mir*_*lav 11 .net string msdn toupper
在.NET Framework中使用字符串的最佳实践中,OrdinalIgnoreCase
建议将StringComparison 用于不区分大小写的文件路径.(我们称之为声明A.)
我同意这一点,因为我可以在同一目录中创建两个文件:
é.txt
e?.txt
Run Code Online (Sandbox Code Playgroud)
它们的文件名不一样,第二个是由e
和修饰符组成的,所以它实际上有两个字母.(您可以尝试使用复制粘贴.)
如果有不变的文化比较(而不是序数比较),NTFS将不允许这些文件,因为在他们解释的同一篇文章中,在不变的文化中 a + ? = å
但在文章中String.ToUpperInvariant()
有不同的建议:(声明B.)
如果需要操作系统标识符的小写或大写版本(例如文件名,命名管道或注册表项),请使用ToLowerInvariant或ToUpperInvariant方法.
我需要创建文件路径集合(实际上HashSet
)来检测重复项.因此,如果创建地图的时候,我会服从声明B,我可以误报结束,因为上述文件名é.txt
和e?.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.
(源)
如果要比较不区分大小写的字符串,则大写和小写都不正确.在这两种变体中都有一些字符搞砸了.
比较不区分大小写的字符串的正确方法是使用一个不敏感的StringComparison
选项(你知道).
使用不区分大小写的数据结构的正确方法是使用其中一个StringComparer.*IgnoreCase
.例如:
new HashSet<string>(StringComparer.InvariantCultureIgnoreCase)
Run Code Online (Sandbox Code Playgroud)
千万不能将它们添加到数据结构前,大写的字符串.在任何代码审查中我都会失败.
如果需要操作系统标识符的小写或大写版本
你不需要这样的东西.本声明不适用于您的情况.