2009-04-19 6 views
1

単語のリストを含む配列をソートし、binarysearchを使って同じものを検索する必要があります。特定の理由により、単語リストは、「en-US」すなわち米国の地域設定のソートルールを使用して常にソートされなければならない。このコードはさまざまな国際的なオペレーティングシステムで動作しますが、もちろんこれは、使用している地域の地域設定に従って単語リストが別々にソートされることを意味します。リトアニア地域の設定で動作するコンピュータ/デバイスで問題が発生する可能性があります。どうして?ほとんどの言語での文字「Y」はX-Y -Zのようにソートされていますが、リトアニア語ではソート順がI-Y -Jです。この動作は私のプログラムに大混乱を引き起こすでしょう。デスクトップPC上で.net - Array.SortとArray.BinarySearchの問題 - 文化とグローバリゼーション

、私が使用して、アメリカ英語に一時的に地域設定を変更することができます:

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

しかし、I以来、 Windows Mobile(CF.NET)用に開発していますが、このコードは実装できません。

私はデバイスの地域設定をプログラマチックに変更することができるハックを見つけましたが、「公式」ではないので危険なので、これらを避けることをお勧めします。

私の質問は、Array.SortとArray.BinarySearchを、デバイスで設定されている地域設定に関係なく、並べ替えや検索中にCultureInfo = "en-US"を使用するにはどうすればいいですか?

​​

と配慮のCultureInfoに取る(および「EN-US」に設定)した比較子を実装するが、私は努力にもかかわらず、それを行う方法がわからない:

私が使用することができます信じています。もし誰かがVB.NetやC#でサンプルコードを投稿したり、その説明をする方法があれば、とても感謝しています。

CF.Netで動作する代替ソリューションについてご存じの方は、もちろん私はすべて耳にします。

ありがとうございました。

EDIT:

私は私の質問は明らかに私は英語との関連を維持したいと述べているので、受け入れソリューションとしてTwanfossonの答えを考えてみます。

しかし、私はGuffaの答えが最良だと信じています。どうして?別の例を使用しましょう:ドイツ語では、ÖÖ -X-Zです。スウェーデン語とフィンランド語では、順序はX-Z-Öです。エストニア語ではソート順序はZ-Ö -Xです。複雑ではないですか? Guffaのソリューションは、ドイツの地域設定で実行されているデバイスでスウェーデンのソート(CultureInfoの変更)を強制することができます。 Comparer.DefaultInvariantを英語に関連付けると、この場合は役に立ちません。恐らくÖという文字が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

まあ、両方への答えは、比較演算を実行することです。今、あなたは文字列の並べ替えに使用することができ

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()) 

をし、それらを見つけるためにIComprarer(Of String)インタフェースを実装し、それが文字列を比較するために使用する独自のCultureInfoオブジェクトの持つクラスを作成します。 :

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

(もちろん、クラスはコンストラクタでカルチャン文字列を受け入れることでもう少し一般化することができます。変数を使用して、String.Compareコールでignorecaseパラメータを使用します)。

関連する問題