场景:
在.Net Core 3.1应用程序上,我们需要比较(Windows OS的)许多文件路径,这些文件路径需要比较并存储在使用字符串比较(不区分大小写)的哈希集和字典中。
我试图找到一种处理所有这些文件路径字符串的简单方法,发现了3个选项:
选项1:
使用StringComparison.OrdinalIgnoreCase
并使用StringComparer.OrdinalIgnoreCase
。
选项2:
创建一个IgnoreCaseString
类,该类包装string
类,并用Equals
覆盖GetHashCode
,operator ==
和StringComparison.OrdinalIgnoreCase
。
public sealed class IgnoreCaseString
{
public IgnoreCaseString(string originalString)
{
this.OriginalString = originalString;
}
public string OriginalString { get; }
public override bool Equals(object obj)
{
if (ReferenceEquals(this, obj))
return true;
if (!(obj is IgnoreCaseString filePathString))
return false;
return OriginalString.Equals(filePathString.OriginalString, StringComparison.OrdinalIgnoreCase);
}
public static bool operator ==(IgnoreCaseString a, IgnoreCaseString b)
{
return Equals(a, b);
}
public static bool operator !=(IgnoreCaseString a, IgnoreCaseString b)
{
return !Equals(a, b);
}
public override int GetHashCode()
{
return OriginalString.GetHashCode(StringComparison.OrdinalIgnoreCase);
}
}
IgnoreCaseString
类。选项3:
使用为此指定的Uri
类。
问题:
答案 0 :(得分:0)
我们需要比较和存储的文件路径
这已经大写字母区分大小写。只有Windows具有不区分大小写的路径,所有其他现代操作系统(无论好坏)都区分大小写。您应该放心使用,并坚持区分大小写。
实际上,我想挑战您考虑如何在任何操作系统上找到错误的大小写路径-从电子表格或其他内容中手动输入?在这种情况下,我将添加一个“浏览”按钮,以打开一个标准的打开文件对话框,并为您提供正确的字符串。
#1,使用
StringComparison.OrdinalIgnoreCase
并使用StringComparer.OrdinalIgnoreCase
。
如果您忽略第一部分,这是一个好的解决方案。通常,任何与“遗忘”有关的事情都可以通过自定义代码分析模块来完成,它本身具有快速且高效的内存功能。
#2,创建一个
IgnoreCaseString
类,该类包装字符串类并用Equals
覆盖GetHashCode
,operator ==
和StringComparison.OrdinalIgnoreCase
。
也许更好的名字是CaseInsensitiveString
,因为“忽略”表示正在执行一个主动操作,而您的字符串不执行任何操作,则只是被动地表现不同。
此解决方案比以前的解决方案使用更多的内存,并且不允许您使用Span
之类的现代结构在紧凑的字符串处理方案中减少内存开销。
您的实现也被破坏,请重新阅读您的操作员:
public static bool operator ==(IgnoreCaseString a, IgnoreCaseString b)
{
return string.Equals(a, b);
}
#3,使用为其指定的
Uri
类。
它用于URI协议路径,其中file://
是其中之一。尽管它当然可以使用file://
处理程序对本地磁盘路径进行编码,但它并不意味着本地磁盘路径。我同意你的观点,似乎有点过分。