2009-04-19 65 views
1

我需要對包含單詞列表的數組進行排序,並使用binarysearch搜索相同的單詞。由於某些原因,單詞列表必須始終使用「en-US」的排序規則排序,即美國地區設置。該代碼將在各種國際操作系統下運行,當然這將意味着根據使用的本地區域設置,單詞列表將根據不同進行排序。在運行立陶宛區域設置的計算機/設備上可能會出現一個問題。爲什麼?由於在大多數語言中的字母「Y」是按照X- Y -Z排序的,而在立陶宛語中,排序順序是I-Y -J。這種行爲會對我的程序造成破壞。.net - Array.Sort和Array.BinarySearch問題 - 文化和全球化

在一個臺式電腦,我可以通過暫時改變區域設置爲美國英語:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture( 「EN-US」)

然而

,因爲我正在爲Windows Mobile(CF.NET)開發,這段代碼不可能實現。

我發現一些黑客可以讓我以編程方式更改設備上的區域設置,但他們不是「官方」,並認爲有風險,所以我寧願避免這些。

所以我的問題是:如何強制Array.Sort和Array.BinarySearch使用CultureInfo =「en-US」時排序和搜索無論設備上設置的區域設置?

我相信我可以使用:

​​

和實施的Comparer考慮到的CultureInfo(並將其設置爲「EN-US」),但我不知道該怎麼做,儘管努力。如果任何人都可以在VB.Net或C#中發佈一些示例代碼或者解釋如何去做,我將非常感激。

如果您瞭解CF.Net中的任何其他解決方案,那麼我當然會全力以赴。

謝謝。

編輯:

我會考慮Twanfosson的答案,因爲我的問題接受的解決方案明確指出,我想保持與英語語言關聯。

但是,爲了靈活性,我相信Guffa的答案是最好的。爲什麼?我們再舉一個例子:在德語中,字母Ö被排序爲Ö -X-Z,而在瑞典語和芬蘭語中,順序是X-Z- Ö。在愛沙尼亞語中,排序順序是Z-Ö -X。複雜,不是嗎? Guffa的解決方案將使我能夠在德國區域設置下運行的設備上強制瑞典語排序(更改CultureInfo)。使用Comparer.DefaultInvariant及其與英語的關聯在這種情況下不會有幫助,可能信Ö將以O結束。因此,我的投票將轉到Guffa。

回答

5

是不可能使用Invariant文化?

InvariantCulture檢索不變文化的實例 。與英文 相關的是 ,但不是與任何國家/地區。

使用不變文化會使這個微不足道。

Array.Sort(myArray, Comparer.DefaultInvariant); 

Array.BinarySearch(myArray, myString, Comparer.DefaultInvariant); 
1

試試這個:

class EnglishComparer : IComparer<string> 
{ 
    static CultureInfo __english = new CultureInfo("en-US"); 

    public int Compare(string x, string y) 
    { 
    return string.Compare(x, y, __english, CompareOptions.None); 
    } 
} 
6

那麼,答案既要實現一個比較器。創建一個實現IComprarer(Of String)接口,並具有其使用比較字符串它自己CultureInfo對象的類:

Public Class StringComparerEnUs 
    Implements IComparer(Of String) 

    Private _culture As CultureInfo 

    Public Sub New() 
     _culture = New CultureInfo("en-US") 
    End Sub 

    Public Function Compare(ByVal x As String, ByVal y As String) 
     Return String.Compate(x, y, false, _culture) 
    End Function 

End Class 

現在你可以用它來串排序:

Array.Sort(theArray, New StringComparerEnUs()) 

,並找到他們:

pos = BinarySearch(theArray, "Dent, Arthur", new StringComparerEnUs()) 

(當然這個類可以更普遍一點通過接受在構造一個文化字符串,你還可以添加變量以利用String.Compare調用中的ignorecase參數。)