2009-12-10 169 views
2

我相信這兩行是相當的,但遇到一個奇怪的問題後,我不再相信這是事實。字符串比較等效

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

是一樣的:

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

是他們實現在CLR有什麼不同?

回答

5

它們並不完全相同;請參閱here

這裏是做一個區分大小寫的比較正確的方法:

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

這種方式也將更加高效becasue它不會爲小寫副本分配一個單獨的字符串。

+2

這將適用於99.999%的情況,但可能會失敗一些。請參閱'土耳其-I問題'http://msdn.microsoft.com/en-us/library/ms973919.aspx – Gonzalo 2009-12-10 16:39:30

+0

@SLaks:我不確定這是什麼意思,但是'OrdinalIgnoreCase' does _解決土耳其語 - 我的問題。 – 2009-12-10 18:36:42

+0

@Pavel:我不知道,謝謝。 – SLaks 2009-12-10 18:52:41

0

比較(字符串,字符串,布爾)的實施.NET:

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); 
} 

和equals

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

那麼,是不是同樣的事情。

6

它們不等價,ToLower/ToUpper可能有一些本地化問題。不區分大小寫比較兩個字符串的方式(在考慮的一個字符串可能爲空,這就是爲什麼我不喜歡str1.Equals法)是靜態String.Equals方法:

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

由於安全的'null'處理的首選版本,但Gonzalo對其他答案的評論也適用於此處,因此應予以考慮。 – 2009-12-10 17:22:50

1

在除了其他答案(@SLaks,@Serhio)之外,我也有義務指出.ToLower()生成另一個字符串。比較沒有據我所知。如果在頻繁調用的代碼中,應用程序中過多的字符串生成可能會在內存使用情況和性能方面反彈。

+0

我確實指出了這一點(在最後一行) – SLaks 2009-12-10 16:46:24

+0

呵呵......現在看到... – 2009-12-10 22:35:35