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

时间:2015-08-21 17:24:45

标签: c# .net string class case-insensitive

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

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

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

我错过了什么?

3 个答案:

答案 0 :(得分:2)

它不会表现为“完全像字符串”。 string类型是特殊的,并且已被添加到语言规范中。 C#字符串表现出特殊行为,例如

  • 引用类型,它按值传递。引用类型通常由...... 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唠叨,因为你正在进行字符串比较而没有指定所需的比较语义,但你的代码将是干净的。

有关详情,请参阅

答案 1 :(得分: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。这将更多地解释比较字符串。

答案 2 :(得分:1)

建立在deathismyfriend的类型上面的答案,我会扩展字符串类:

public void setRefNumber (String ref)
{
refnumber = ref;
if (ref.length() < 3) {
    System.out.println("reference number must have at least 3 characters");
}
else {       
 refnumber = ref;
}

电话:

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