题
比较串C#是非常简单的。实际上有几种方法来这样做。我列出了一些在框如下。我好奇的是它们之间的差异,当一个应该使用超过其他人吗?其中一个应该被避免不惜一切代价?还有更多我没有上市的?
string testString = "Test";
string anotherString = "Another";
if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}
(注:我正在寻找平等在这个例子中,不低于或高于但是随时评论的那个)
解决方案
这里的规则对于如何将这些职能的工作:
stringValue.CompareTo(otherStringValue)
null
来前一个字符串- 它使用
CultureInfo.CurrentCulture.CompareInfo.Compare
, 这意味着它将使用一个文化相关的比较。这可能意味着ß
会比较相等SS
在德国,或者类似的
stringValue.Equals(otherStringValue)
null
被认为不等于什么- 除非另行指定一个
StringComparison
选项,它将使用什么看起来像一个直接的顺序平等检查,即ß
是不一样的SS
, 在任何语言或文化
stringValue == otherStringValue
- 是不一样的
stringValue.Equals()
. - 的
==
操作者呼吁静Equals(string a, string b)
方法(其中转去一个内部EqualsHelper
做比较。 - 叫
.Equals()
上null
串得到null
参考的例外,而上==
不。
Object.ReferenceEquals(stringValue, otherStringValue)
只是检查参考文献都是相同的,即它不仅仅是两个字相同的内容,你是比较一串的对象本身。
注意到与上述选项,使用的方法的呼吁,有重载有更多的选择,指定如何进行比较。
我的建议如果你只是想要检查平等是让你的心你是否要使用一个文化相关的比较或不,然后使用 .CompareTo
或 .Equals
, 根据选择。
其他提示
从MSDN:
"CompareTo方法的设计主要用于排序或 按字母顺序排列行动。它不应该被用来当主 目的的方法是确定两个字符串 相当。确定两个字符串是否相当,呼叫 等方法"。
他们建议使用 .Equals
而不是的 .CompareTo
找时仅仅是为女平等。我不知道,如果之间是有区别的 .Equals
和 ==
的 string
类。我有时会使用 .Equals
或 Object.ReferenceEquals
而不是的 ==
对于我自己的类情况下有人过来在稍后的时间和重新定义了 ==
操作员用于该类。
如果你好奇的差异BCL方法, 反射器 是你的朋友:-)
我按照这些准则:
确切匹配: 编辑:我以前总是用==操作上的原则,即内部的平等(string,string)的对象==operator是用来比较的对象引用,但它似乎是斯特拉.等(strB)仍然是1到11%的速度总的比串。等(斯特拉,strB),斯特拉==strB,并串。CompareOrdinal(斯特拉,strB).我循环测试的有秒表在这两个拘留/非拘留串的价值,用相同的/不同的字符串的长度和规模不同(图1B到5MB).
strA.Equals(strB)
人类可读的匹配(西方的文化、种情况不敏感的):
string.Compare(strA, strB, StringComparison.OrdinalIgnoreCase) == 0
人类可读的比赛(其他所有文化、不敏感的情况下/口音/kana/等定义的默):
string.Compare(strA, strB, myCultureInfo) == 0
人类可读的配合定义的规则(所有其他文化):
CompareOptions compareOptions = CompareOptions.IgnoreCase
| CompareOptions.IgnoreWidth
| CompareOptions.IgnoreNonSpace;
string.Compare(strA, strB, CultureInfo.CurrentCulture, compareOptions) == 0
作为 Ed 说CompareTo是用于排序。
是有差别的,但是,两者之间。平等和==.
==决心 基本上 下列代码:
if(object.ReferenceEquals(left, null) &&
object.ReferenceEquals(right, null))
return true;
if(object.ReferenceEquals(left, null))
return right.Equals(left);
return left.Equals(right);
简单的原因是以下会扔一个例外:
string a = null;
string b = "foo";
bool equal = a.Equals(b);
和下面不会:
string a = null;
string b = "foo";
bool equal = a == b;
很好的解释和做法有关串比较的问题可以发现在文章 新建议使用的字符串中Microsoft。网2.0 并且还在 最佳做法采用字符串中。净框架.
每个提到的方法(和其他)具有特别的目的。之间的关键区别他们是什么样的 StringComparison枚举 他们使用的默认。有几种选择:
- CurrentCulture
- CurrentCultureIgnoreCase
- 特定元素
- InvariantCultureIgnoreCase
- 序
- OrdinalIgnoreCase
每一个以上比较类型的目标不同使用情况:
- 序
- 情况敏感的内部标识符
- 情况敏感的标识符标准,如XML和HTTP
- 情况敏感的安全有关的设置
- OrdinalIgnoreCase
- 情况不敏感的内部标识符
- 情况不敏感的标识符标准,如XML和HTTP
- 文件路径(在Microsoft Windows)
- 注册键/价值
- 环境变量
- 资源标识符(处理名称,例如)
- 情况不敏感的安全有关的设置
- 特定元素或InvariantCultureIgnoreCase
- 一些持久的语言相关的数据
- 显示的语言的数据需要一个固定的排列顺序
- CurrentCulture或CurrentCultureIgnoreCase
- 数据显示用户
- 大多数用户输入
注意, StringComparison枚举 以及重载串比较的方法,存在。网2.0.
String.CompareTo方法(String)
事实上是类安全执行情况 类.CompareTo方法.默认解释:CurrentCulture.
使用:
CompareTo方法的设计主要用于排序或者按字母顺序排列行动
因此
执行这类接口将必然使用这种方法
String.比较方法
静态部件的 String类 其中有许多重载。默认解释:CurrentCulture.
只要有可能,你应该叫超负荷的比较方法,包括StringComparison参数。
String.平等的方法
复盖从对象类和过载于类型的安全。默认解释:序.请注意:
String类的平等的方法包括 静等于, , 静电操作员==, , 方法的实例等于.
StringComparer类
还有另一种方式来处理串的比较,特别是旨在排序:
你可以使用 StringComparer类 创建一个特定类型的比较要的元素排序在一个通用的集合。类如Hashtable、字典、SortedList,并SortedList使用StringComparer类排序的目的。
不能从事有99%的时候,你需要这样做,但是如果你不得不这样做在一个循环中的几百万次我会强烈建议您使用。等于或==因为尽快找到一字不匹配它引发的整个事情作出虚假的,但是如果您使用的CompareTo它将必须找出哪些字低于其他,导致略微更糟糕的表演时间.
如果应用,将运行在不同国家的,我会建议你看看默的影响和可能的使用。平等的。因为我只是真的写的应用程序,用于美国(并不关心如果它不能正常工作的人),我总是只要使用==.
在形式列在这里,没有多少差别的两个。 CompareTo
结束了叫一个 CompareInfo
方法不会比使用目前文化; Equals
被称为过 ==
操作员。
如果你考虑过载,然后事情变得不同。 Compare
和 ==
只能使用目前文化比较。 Equals
和 String.Compare
可以采取一个 StringComparison
枚举的论点,即允许指定文化不敏感或情况不敏感的比较。只 String.Compare
允许指定一个 CultureInfo
和执行比较用的文化默认文化。
由于其通用性,我找到我的使用 String.Compare
超过任何其他比较的方法;它让我明确指定我想要什么。
一个很大的区别注意。等()将引发一个例外,如果第一串是空的,而==不会。
string s = null;
string a = "a";
//Throws {"Object reference not set to an instance of an object."}
if (s.Equals(a))
Console.WriteLine("s is equal to a");
//no Exception
if(s==a)
Console.WriteLine("s is equal to a");
- s1。CompareTo(s2): 不用如果主要目的是确定两个字符串是否等同
- s1==s2: 不能忽视的情况下
- s1。等(s2,StringComparison): 抛出NullReferenceException如果s1是空的
- String.等(s2,StringComparison): 通过过程的eliminiation,这个 静 方法是 获胜者 (假定的典型使用情况,以确定两个字符串是否等同)!
使用。等于是还要容易得多 阅读.
与。平等的,你还可以获得的StringComparison的选择。非常方便用于忽略的情况和其他的东西。
顺便说一句,这将为false
string a = "myString";
string b = "myString";
return a==b
由于==进行比较价值的a和b(这是指针),这只会评估,如果指针指向同一物中的存储器。.等于取消引用的指针和进行比较价值观存在的指针。a.等于(b)会是真的在这里。
如果你改变b:
b = "MYSTRING";
然后一个.等于(b)是虚假的,但是
a.Equals(b, StringComparison.OrdinalIgnoreCase)
会是真的
a.CompareTo(b)呼吁串的CompareTo功能,其比较的数值在本指针和返回 <0如果价值存在一个低于该价值的存在b、返回0如果一个.等于(b)项是真实的,否则为0。然而,这是情况的敏感性,我认为有可能选择CompareTo到忽略的情况下,这样,但是没有时间来看看现在。正如其他人已经指出,这将是完成对排序。比较平等以这种方式将会导致不必要的开销。
我敢肯定我留下的东西,但我认为这应该是足够的信息开始试验如果你需要更多的细节。