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

ar5n3qh5  于 2023-05-08  发布在  .NET
关注(0)|答案(3)|浏览(221)

要创建一个不区分大小写的字符串类型,而该类型的行为与字符串完全相同,需要做什么?
我从来没有听说过任何人做出这样的不区分大小写的字符串类型,它显然不是框架的一部分,但它似乎非常有用。SQL默认情况下不区分大小写的比较就是一个很好的例子。所以我想这要么是不可能的,要么是有一个很好的理由为什么没有人这么做,而我却没有意识到。
我知道它需要使用隐式运算符进行赋值,并且您必须重写equals运算符。对于重写GetHashCode(),我认为您可以返回ToLower().GetHashCode()。
我错过了什么?

nnsrf1az

nnsrf1az1#

比较字符串是相当容易的。您可以简单地使用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。这将解释更多关于比较字符串的内容。

fslejnso

fslejnso2#

基于上面deathismyfriend的回答,我将扩展string类:

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

nwlls2ji3#

它的行为不会“* 完全像字符串 *”。string类型是特殊的,并被纳入语言规范。C#字符串表现出特殊的行为,例如

  • 作为一个 reference 类型,它通过值传递。引用类型是正常的被... well... 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()
           ;

[**编辑注意:**虽然有人可能认为这应该是可能的,但稍微摆弄一下表明,实际上不能创建CompareInfo的自定义实现/子类型,因为它没有公共构造函数,其默认构造函数是internal。更多关于这个问题的答案:Globally set String.Compare/ CompareInfo.Compare to Ordinal
嗯……
你可以做的是:
字符串比较使用当前区域性的排序规则/比较规则进行。为您的应用创建一个自定义区域性,比如说,使用您需要的排序规则/比较规则的美国区域性的副本。设置为当前文化和鲍勃的叔叔。
你仍然会得到编译器/ReSharper的抱怨,因为你在没有指定所需的比较语义的情况下进行字符串比较,但是你的代码将是干净的。
有关更多详细信息,请参见

相关问题