C# 是否可以创建不区分大小写的字符串类?

C# 是否可以创建不区分大小写的字符串类?,c#,.net,string,class,case-insensitive,C#,.net,String,Class,Case Insensitive,创建一个不区分大小写的字符串类型需要什么,否则它的行为与字符串完全相同 我从来没有听说过有人制作这样的不区分大小写的字符串类型,它显然不是框架的一部分,但它似乎非常有用。SQL默认情况下进行不区分大小写的比较就是一个很好的例子。所以我认为这要么是不可能的,要么就是有一个很好的理由,我不知道为什么没有人这么做 我知道这需要使用隐式运算符进行赋值,并且必须重写equals运算符。对于重写GetHashCode(),我认为您可以返回ToLower()。GetHashCode() 我遗漏了什么?比较字符

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

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

我知道这需要使用隐式运算符进行赋值,并且必须重写equals运算符。对于重写GetHashCode(),我认为您可以返回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.
你也应该看看。这将解释更多关于比较字符串的内容。

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

  • 作为引用类型,按值传递。引用类型通常通过…嗯…引用传递

  • 默认情况下被拘留。这意味着给定字符串只有一个实例。以下代码只创建一个字符串:
    a
    b
    c
    都指向字符串的同一个实例
    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

Grrr…]

你能做的是:

字符串比较是使用当前区域性的排序规则/比较规则完成的。为你们的应用程序创建一个自定义区域性,比如说,一个使用你们需要的排序/比较规则的美国区域性副本。将其设置为当前文化和Bob的叔叔

您仍然会收到编译器/ReSharper的抱怨,因为您在进行字符串比较时没有指定所需的比较语义,但是您的代码将是干净的

有关详细信息,请参阅


基于上面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);

您应该看看这个字符串比较@deathismyfriend在过去,我只需要在这里或那里做这件事,但现在我正在开发一个数据上传工具,我真的需要它在任何地方都不区分大小写。如果可能的话,拥有一个实际以这种方式工作的类型,而不是使用实用程序方法,这将是一种令人惊叹的方式。但我同意这是目前我所知道的最好的处理方法。@EZI但是有一千个XY问题从来没有“需要”去解决,但它们是因为它使代码更干净,整个编程体验更好。而且,在你问实际问题之前,你不知道没有更干净的解决方案。SQL是一个怎样的例子?SQL just a具有不同的默认值。对于不区分大小写的字符,SQL没有单独的数据类型。为什么不试试那些你知道需要的东西呢。谢谢。我知道如何进行不区分大小写的字符串比较。我只想要一个内置了这个功能的类型,这样我的代码看起来更干净。你可以随时添加一个扩展方法,但我只会使用上面提到的相等方法。谢谢,我想我实际上不会担心它在内存管理方面的表现是一样的;但是关于通过值传递的部分显然很重要。A好的,你关于特殊字符串行为的例子是不正确的。1.所有C#类型在传递时不带修饰符,而不仅仅是字符串,而是按值传递(见第10.6.1.1节或)。2.示例字符串
a
b
c
,将任意两个字符串与ReferenceEquals进行比较时,返回false。此外,它们都不是实习的,您可以通过运行例如
ReferenceEquals(a,string.IsInterned(a))
来检查。是的,这可能是最实用的解决方案。很高兴提供帮助。如果这满足了你的需要,请标记为答案。丹,他在原始问题中的要求无法实现。这里所有的答案都是可供选择的解决方案。我的回答将为您提供一种不区分大小写的比较方法。告诉我,为什么我需要在“int result=s1.CaseInsensitveCompare(s2);”上加上“if(s1==s2)”?但在这里的每一个答案中,你都会选择我的答案并投反对票?为什么,伙计?