文件路径的C#字符串不区分大小写的类

时间:2020-07-29 14:31:39

标签: c# string .net-core

场景:

在.Net Core 3.1应用程序上,我们需要比较(Windows OS的)许多文件路径,这些文件路径需要比较并存储在使用字符串比较(不区分大小写)的哈希集和字典中。

我试图找到一种处理所有这些文件路径字符串的简单方法,发现了3个选项:

选项1:

使用StringComparison.OrdinalIgnoreCase并使用StringComparer.OrdinalIgnoreCase

  • 优点:无需实现新类,只需使用现有框架即可。
  • 最大缺点:在开发新代码时很容易忘记这些。 (我们在应用程序中有很多不区分大小写的字符串)

选项2:

创建一个IgnoreCaseString类,该类包装string类,并用Equals覆盖GetHashCodeoperator ==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类。

  • 优点:现有课程,易于使用。
  • 缺点:内存和性能开销。

问题:

  • 是否有内置或简便的方法?
  • 还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

我们需要比较和存储的文件路径

这已经大写字母区分大小写。只有Windows具有不区分大小写的路径,所有其他现代操作系统(无论好坏)都区分大小写。您应该放心使用,并坚持区分大小写。

实际上,我想挑战您考虑如何在任何操作系统上找到错误的大小写路径-从电子表格或其他内容中手动输入?在这种情况下,我将添加一个“浏览”按钮,以打开一个标准的打开文件对话框,并为您提供正确的字符串。

#1,使用StringComparison.OrdinalIgnoreCase并使用StringComparer.OrdinalIgnoreCase

如果您忽略第一部分,这是一个好的解决方案。通常,任何与“遗忘”有关的事情都可以通过自定义代码分析模块来完成,它本身具有快速且高效的内存功能。

#2,创建一个IgnoreCaseString类,该类包装字符串类并用Equals覆盖GetHashCodeoperator ==StringComparison.OrdinalIgnoreCase

也许更好的名字是CaseInsensitiveString,因为“忽略”表示正在执行一个主动操作,而您的字符串不执行任何操作,则只是被动地表现不同。

此解决方案比以前的解决方案使用更多的内存,并且不允许您使用Span之类的现代结构在紧凑的字符串处理方案中减少内存开销。

您的实现也被破坏,请重新阅读您的操作员:

public static bool operator ==(IgnoreCaseString a, IgnoreCaseString b)
{
    return string.Equals(a, b);
}

#3,使用为其指定的Uri类。

它用于URI协议路径,其中file://是其中之一。尽管它当然可以使用file://处理程序对本地磁盘路径进行编码,但它并不意味着本地磁盘路径。我同意你的观点,似乎有点过分。