创建不区分大小写的字符串类型需要什么,否则其行为与字符串完全相同?
我从来没有听说有人像这样制作不区分大小写的字符串类型,而且它显然不是框架的一部分,但它似乎非常有用。 SQL默认情况下进行不区分大小写的比较这一事实就是一个很好的例子。因此,我认为这是不可能的,或者说真的很好的理由为什么没有人这样做,我不知道。
我知道它需要使用隐式运算符进行赋值,并且您必须覆盖equals运算符。为了覆盖GetHashCode(),我认为你可以返回ToLower()。GetHashCode()。
我错过了什么?
答案 0 :(得分:2)
它不会表现为“完全像字符串”。 string
类型是特殊的,并且已被添加到语言规范中。 C#字符串表现出特殊行为,例如
是引用类型,它按值传递。引用类型通常由...... well ... 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()
;
[编辑注意:虽然人们可能认为这应该是可能的,但有点摆弄表明实际上无法创建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);
}
}