可以创建不区分大小写的字符串 class 吗?

Possible to create case insensitive string class?

创建不区分大小写的字符串类型需要什么,否则它的行为与字符串完全一样?

我从来没有听说过有人制作了这样一个不区分大小写的字符串类型,它显然不是框架的一部分,但它似乎非常有用。 SQL 默认情况下不区分大小写的比较就是一个很好的例子。所以我认为这要么是不可能的,要么有一个真的很好的理由,为什么没有人这样做我不知道。

我知道它需要使用隐式运算符进行赋值,并且您必须重写等号运算符。为了覆盖 GetHashCode(),我想你可以 return ToLower().GetHashCode().

我错过了什么?

比较字符串相当容易。您可以简单地使用 equals 方法或 compare 方法。

示例:

string s = "A";
s.Equals("a", StringComparison.InvariantCultureIgnoreCase); // Will return true.

string s = "A";
s.Equals("a", StringComparison.InvariantCulture); // Will return false.

您还应该看看 this。这将解释更多关于比较字符串的内容。

它不会表现得“完全像一个字符串”。 string 类型很特殊,已融入语言规范。 C# 字符串表现出特殊行为,例如

  • 引用类型,按值传递。引用类型通常通过...嗯...reference.

  • 默认是interned。这意味着给定字符串只有一个实例。以下代码只创建了一个字符串:abc 都指向字符串 quick 的同一个实例。这意味着 Object.ReferenceEquals() 在比较任意两个时为真:

    string a = "The quick brown dog...".Substring(4,5) ;
    string b = new string(new char[]{'q','u','i','c','k'});
    string c = new StringBuilder().
               .Append('q')
               .Append('u')
               .Append('i')
               .Append('c')
               .Append('k')
               .ToString()
               ;
    

[编辑注意: 虽然有人可能认为这应该是可能的,但稍微摆弄一下表明人们实际上无法创建自定义 implementation/subtype CompareInfo 因为它没有 public 构造函数,它的默认构造函数是 internal。这个问题的更多答案:Globally set String.Compare/ CompareInfo.Compare to Ordinal

呜呜……]

可以做的是这样的:

字符串比较是使用当前区域性的 collation/comparison 规则完成的。为您的应用创建自定义文化,例如,使用您需要的 collation/comparison 规则的美国文化副本。将其设置为当前文化和 Bob's-yer-uncle。

你仍然会 compiler/ReSharper 抱怨,因为你在进行字符串比较时没有指定所需的比较语义,但你的代码将是干净的。

有关详细信息,请参阅

基于上面 deathismyfriend 的回答类型,我将扩展字符串 class:

public static class StringExtensions
{
    public static int CaseInsensitveCompare(this string s, string stringToCompare)
    {
        return String.Compare(s, stringToCompare, StringComparison.InvariantCultureIgnoreCase);
    }
}

然后调用:

int result = firstString.CaseInsensitveCompare(secondString);