2010-05-01 140 views
133

這將是更好的代碼:字符串比較:InvariantCultureIgnoreCase vs OrdinalIgnoreCase?

int index = fileName.LastIndexOf(".", StringComparison.InvariantCultureIgnoreCase); 

int index = fileName.LastIndexOf(".", StringComparison.OrdinalIgnoreCase); 
+8

這將取決於你想要實現什麼...... – 2010-05-01 11:03:22

+0

@MartinLiversage標記c#問題作爲vb.net問題的重複..至少有趣。在這種情況下,相信兩者應該共享.Net標記 – Lanorkin 2017-08-28 05:29:21

+0

@Lanorkin:兩個枚舉值在VB.NET和C#中的區別是相同的,並且這個問題和其他問題的答案都不是VB.NET或C#。這兩個問題顯然是重複的,通過將它們關聯起來,我更容易找到關於這些枚舉值的相關信息。 – 2017-08-28 08:24:03

回答

33

如果你真的想只匹配點,那麼CultureInfo.Ordinal會最快,因爲沒有區別。

44

的FxCop通常喜歡OrdinalIgnoreCase。但您的要求可能會有所不同

對於英語來說,幾乎沒有什麼區別。當你漫步到具有不同書面語言結構的語言中時,這成爲一個問題。我沒有足夠的經驗給你比這更多。

OrdinalIgnoreCase

由 OrdinalIgnoreCase屬性對待 在琴絃 字符比較,就好像它們被轉換 使用的約定固定區域性的 爲大寫,然後 進行返回的StringComparer與語言無關的簡單字節比較 。 當 比較以編程方式生成 的字符串或比較 不區分大小寫的資源(如 路徑和文件名)時,這是最合適的。 http://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase.aspx

InvariantCultureIgnoreCase

由 InvariantCultureIgnoreCase屬性 返回的StringComparer在忽略情況下的語言 相關的方式比較字符串,但 它是不適合於在任何 特定文化顯示。其主要的 應用程序是以 的方式訂購字符串,該方式在 文化中將是相同的。 http://msdn.microsoft.com/en-us/library/system.stringcomparer.invariantcultureignorecase.aspx

固定區域性是由 InvariantCulture屬性返回的 CultureInfo對象。

InvariantCultureIgnoreCase 屬性實際上返回從 StringComparer類派生的匿名類的實例 。

193

兩種代碼總是更好。他們做不同的事情,所以他們擅長不同的事情。

InvariantCultureIgnoreCase使用基於英文的比較規則,但沒有任何區域變化。這對於仍然考慮到一些語言方面的中立比較是有益的。

OrdinalIgnoreCase比較沒有文化方面的字符代碼。這對於精確比較非常有用,例如登錄名,但不適用於排序具有不尋常字符的字符串,如éö。這也比較快,因爲在比較之前沒有額外的規則可供使用。

+3

當InvariantCultureIgnoreCase遇到'ä'時如何表現?反對'OrdinalIgnoreCase'...? – 2012-11-08 14:28:17

+1

@羅伊納米爾:不變的文化是以英語爲基礎的,所以它會把'ä','à',''等等當作對待。作爲'a',即刪除變音符號。使用序數文化會在所有常規字母之後放置帶有變音符號的字符,即嚴格按字符代碼排序。 – Guffa 2012-11-08 15:45:03

+0

你的意思是說它們全都是大寫的A(InvariantCultureIgnoreCase)吧? – 2012-11-08 15:52:52

14

你似乎在做文件名比較,所以我只想補充一點,OrdinalIgnoreCase最接近爲NTFS做什麼(這是不完全一樣,但它比InvariantCultureIgnoreCase接近)

+2

你有NTFS的參考嗎? – Basic 2016-11-06 17:04:50