可以创建不区分大小写的字符串 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。这意味着给定字符串只有一个实例。以下代码只创建了一个字符串: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()
;
[编辑注意: 虽然有人可能认为这应该是可能的,但稍微摆弄一下表明人们实际上无法创建自定义 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);
创建不区分大小写的字符串类型需要什么,否则它的行为与字符串完全一样?
我从来没有听说过有人制作了这样一个不区分大小写的字符串类型,它显然不是框架的一部分,但它似乎非常有用。 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。这意味着给定字符串只有一个实例。以下代码只创建了一个字符串:
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() ;
[编辑注意: 虽然有人可能认为这应该是可能的,但稍微摆弄一下表明人们实际上无法创建自定义 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);