字符串比较等价物

时间:2009-12-10 16:29:29

标签: c# .net string clr string-comparison

我相信这两行是等价的,但在遇到一个奇怪的问题之后,我不再相信这种情况。

String mimeType = context.Request.ContentType;
(String.Compare("text/xml", mimeType, true) == 0))

与:

相同
context.Request.ContentType.ToLower().Equals("text/xml")

他们在CLR中的实现有何不同?

4 个答案:

答案 0 :(得分:6)

它们不等同,ToLower / ToUpper可能存在一些本地化问题。在没有区分大小写的情况下比较两个字符串的方法(考虑其中一个字符串可能为null,这就是我不喜欢str1.Equals方法的原因)是静态String.Equals方法:

bool areEqual = String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase);

答案 1 :(得分:5)

它们不完全等同;见here

以下是进行不区分大小写的比较的正确方法:

bool areSame = str1.Equals(str2, StringComparison.OrdinalIgnoreCase);

这种方式也会更有效,因为它不会为小写副本分配单独的字符串。

答案 2 :(得分:1)

除了其他答案(@SLaks,@ Serhio)之外,我还有义务指出.ToLower()会生成另一个字符串。比较并不是我所知道的。如果频繁调用代码,应用程序中过多的字符串生成可能会在内存使用和性能方面产生影响。

答案 3 :(得分:0)

在.NET中实现Compare(string,string,boolean):

public static int Compare(string strA, string strB, bool ignoreCase)
{
    if (ignoreCase)
    {
        return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.IgnoreCase);
    }
    return CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.None);
}

和等于

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public bool Equals(string value)
{
    if ((value == null) && (this != null))
    {
        return false;
    }
    return EqualsHelper(this, value);
}

所以,同样的事情。