2016-09-23 6 views
4

なぜ "®"が "U"の代わりに最初に来るのですか?注文したの文化による注文が期待通りに機能しない

CultureInfo ci = CultureInfo.GetCultureInfo("lt-LT"); 
    bool ignoreCase = true; //whether comparison should be case-sensitive 
    StringComparer comp = StringComparer.Create(ci, ignoreCase); 
    string[] unordered = { "Za", "Žb", "Ūa", "Ub" }; 
    var ordered = unordered.OrderBy(s => s, comp); 

結果: UA のUb ザ ZB

は次のようになります。ここでのUb UAザZB

は順番にリトアニアの手紙です。 https://www.assorti.lt/userfiles/uploader/no/norvegiska-lietuviska-delione-abecele-maxi-3-7-m-vaikams-larsen.jpg

+2

http://stackoverflow.com/questions/1371813/why-does-string-compare-seem-to-handle-accented-characters-inconsistently –

答えて

1

あなたの問題を解決するにはどうすればいいですか? これは最適化されていませんが、解決方法のアイデアを与えることができます。 LithuanianStringクラスを作成します。このクラスは、文字列をカプセル化するためにのみ使用されます。 このクラスは、LithuanianStringのリストをソートできるように、IComparableを実装しています。ここで

は、クラス何ができるかです:

public class LithuanianString : IComparable<LithuanianString> 
{ 

    const string UpperAlphabet = "AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"; 
    const string LowerAlphabet = "aąbcčdeęėfghiįyjklmnoprsštuųūvzž"; 
    public string String; 

    public LithuanianString(string inputString) 
    { 
     this.String = inputString; 
    } 

    public int CompareTo(LithuanianString other) 
    { 
     var maxIndex = this.String.Length <= other.String.Length ? this.String.Length : other.String.Length; 
     for (var i = 0; i < maxIndex; i++) 
     { 
      //We make the method non case sensitive 
      var indexOfThis = LowerAlphabet.Contains(this.String[i]) 
       ? LowerAlphabet.IndexOf(this.String[i]) 
       : UpperAlphabet.IndexOf(this.String[i]); 

      var indexOfOther = LowerAlphabet.Contains(other.String[i]) 
       ? LowerAlphabet.IndexOf(other.String[i]) 
       : UpperAlphabet.IndexOf(other.String[i]); 

      if (indexOfOther != indexOfThis) 
       return indexOfThis - indexOfOther; 
     } 
     return this.String.Length - other.String.Length; 
    } 
} 

そして、ここでは、私はそれを試して作ったサンプルです:

static void Main(string[] args) 
    { 
     string[] unordered = { "Za", "Žb", "Ūa", "Ub" }; 

     //Create a list of lithuanian string from your array 
     var lithuanianStringList = (from unorderedString in unordered 
      select new LithuanianString(unorderedString)).ToList(); 
     //Sort it 
     lithuanianStringList.Sort(); 

     //Display it 
     Console.WriteLine(Environment.NewLine + "My Comparison"); 
     lithuanianStringList.ForEach(c => Console.WriteLine(c.String)); 
    } 

出力が期待されるものです。

UbàaZaŽb

このクラスでは、最初に定義された2つの定数の文字を置き換えるだけで、カスタムアルファベットを作成できます。

関連する問題