2009-04-19 5 views
1

Ich muss ein Array mit einer Liste von Wörtern sortieren und die gleiche Suche mit binarysearch. Aus bestimmten Gründen muß die Wortliste immer unter Verwendung der Sortierregeln von "en-US", d. H. American Regional Settings, sortiert werden. Der Code wird unter verschiedenen internationalen Betriebssystemen laufen und das bedeutet natürlich, dass die Wortliste entsprechend den verwendeten lokalen Ländereinstellungen anders sortiert wird. Ein Problem könnte auf einem Computer/Gerät auftreten, auf dem litauische Ländereinstellungen ausgeführt werden. Warum? Weil der Buchstabe "Y" in den meisten Sprachen wie X- Y -Z in Litauisch sortiert ist, ist die Sortierreihenfolge I- Y -J. Dieses Verhalten würde meinem Programm Schaden zufügen..net - Probleme mit Array.Sort und Array.BinarySearch - Kultur und Globalisierung

Auf einem Desktop-PC, könnte ich momentan die Ländereinstellungen in amerikanischem Englisch ändern, indem Sie mit:

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ("en-US")

aber da ich Ich entwickle für Windows Mobile (CF.NET), dieser Code ist nicht zu implementieren.

Ich habe ein paar Hacks gefunden, die mir erlauben, die regionalen Einstellungen auf dem Gerät programmatisch zu ändern, aber sie sind nicht "offiziell" und werden als riskant betrachtet, also ziehe ich es vor, diese zu vermeiden.

Meine Frage ist also: Wie kann ich Array.Sort und Array.BinarySearch zwingen, CultureInfo = "en-US" beim Sortieren und Suchen unabhängig von den auf dem Gerät eingestellten Ländereinstellungen zu verwenden?

Ich glaube, ich könnte:

Public Shared Function BinarySearch(Of T) (_ 
    array As T(), _ 
    value As T, _ 
    comparer As IComparer(Of T) _ 
) As Integer 

und Comparer Umsetzung in Betracht Culture nehmen (und setzen Sie sich auf „en-US“), aber ich weiß nicht, wie das hart trotz aller Bemühungen zu tun. Wenn irgendjemand einen Beispielcode in VB.Net oder C# posten könnte oder eine Erklärung, wie es geht, wäre ich sehr dankbar.

Wenn Sie über eine alternative Lösung wissen, die in CF.Net funktioniert, dann bin ich natürlich ganz Ohr.

Danke.

EDIT:

werde ich Twanfosson Antwort als die akzeptierte Lösung, da meine Frage klar gesagt der Meinung, dass ich eine Verbindung mit der englischen Sprache pflegen wollte.

Aber in Bezug auf Flexibilität glaube ich, dass Guffas Antwort die beste ist. Warum? Lassen Sie uns ein anderes Beispiel verwenden: Auf Deutsch ist der Buchstabe Ö sortiert Ö -X-Z während in Schwedisch und Finnisch ist die Bestellung X-Z- Ö. In Estnisch ist die Sortierreihenfolge Z- Ö -X. Kompliziert, nicht wahr? Guffas Lösung wird es mir erlauben, schwedisches Sortieren oder Ändern von CultureInfo auf einem Gerät durchzuführen, das unter deutschen regionalen Einstellungen ausgeführt wird. Mit Comparer.DefaultInvariant mit seiner Verbindung zu Englisch würde in diesem Fall nicht helfen, wahrscheinlich würde der Brief Ö mit O enden. Daher wird meine Abstimmung nach Guffa gehen.

Antwort

5

Ist es nicht möglich, die Kultur Invariant zu verwenden?

InvariantCulture ruft eine Instanz der invarianten Kultur ab. Es ist mit der englischen Sprache verbunden, aber nicht mit irgendeinem Land/Region.

Die Verwendung der invarianten Kultur würde dies trivial machen.

Array.Sort(myArray, Comparer.DefaultInvariant); 

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

Versuchen Sie folgendes:

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

Nun, die Antwort auf beide ist ein Vergleich zu implementieren. Erstellen Sie eine Klasse, die die IComprarer(Of String)-Schnittstelle implementiert und seine eigene CultureInfo Objekt hat, dass es die Zeichenfolgen vergleichen verwendet:

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 

Jetzt können Sie es verwenden, um die Saiten zu sortieren:

Array.Sort(theArray, New StringComparerEnUs()) 

und sie zu finden :

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

(die Klasse kann natürlich etwas allgemeinere durch eine Kultur Zeichenfolge im Konstruktor akzeptieren gemacht werden, und Sie können auch ein hinzufügen Variable, um den Ignorierparameter im String.Compare Aufruf zu verwenden.)

Verwandte Themen