首页 文章

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

提问于
浏览
2

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

我显然不是框架的一部分,但似乎它可能非常有用 . SQL默认情况下进行不区分大小写的比较这一事实就是一个很好的例子 . 所以我不可能,或者有一个很好的理由为什么没有人这样做,我不知道 .

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

我错过了什么?

3 回答

  • 2

    它不会表现得“完全像一个字符串” . string 类型是特殊的,并且被烘焙到语言规范中 . C#字符串表现出特殊的行为,例如

    • 是一个引用类型,它通过值传递 . 引用类型通常由...... well ...引用传递 .

    • 默认为实习 . 这意味着只有一个给定字符串的实例 . 以下代码导致只创建一个字符串: 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()
               ;
    

    [ edited to note: 虽然有人可能会认为这应该是可能的,但有点摆弄表明实际上无法创建 CompareInfo 的自定义实现/子类型,因为它没有公共构造函数且其默认构造函数是 internal . 更多关于这个问题的答案:Globally set String.Compare/ CompareInfo.Compare to Ordinal

    哎呀...]

    could do 是这样的:

    字符串比较使用当前文化的校对/比较规则完成 . 为您的应用创建自定义文化,例如,使用您需要的排序/比较规则的美国文化副本 . 把它当作当前的文化和鲍勃的叔叔 .

    你仍然会得到编译器/ ReSharper唠叨,因为你正在进行字符串比较而没有指定所需的比较语义,但你的代码将是干净的 .

    有关详细信息,请参阅

  • 1

    比较字符串相当容易 . 您只需使用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 . 这将更多地解释比较字符串 .

  • 1

    基于deathismyfriend上面的答案类型,我会扩展字符串类:

    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);
    

相关问题