2009-12-04 8 views
18

bananäppleapelsindruva LINQを文化に応じて注文するにはどうすればよいですか?

このリストを注文したいと思います(これは実際のクエリの非常に単純化されたバージョンです)。

var result = from f in fruits // The list mentioned above 
      orderby f 
      select f 

これにより、apelsinäpplebanandruvaが得られます。しかし、スウェーデンのアルファベットによれば、私は次のようになるはずです:apelsinbanandruvaäpple

System.Threading.Thread.CurrentThread.CurrentCulturesv-SEに変更しようとしましたが、私自身のラムダ関数を記述して.OrderBy(...)を使用する必要がありますか、またはLINQをそのまま維持するために何かできますか?

+0

Iこれは古い質問であり、私のコメントはあなたが尋ねたものに正確ではないことをご存じですか?私はEntity Frameworkからlinq経由でデータベースにデータをソートすることにも問題がありました。私は、私のデータベースに間違った照合順序が設定されていることを理解しました。私はそれをデンマーク語に変更し、並べ替えが正しく機能しました。 –

答えて

32

あなたはクエリ式でこれを行うことはできませんが、明示的なドット表記でそれを行うことができます:スレッドの現在のカルチャを想定し、それを行う必要があります

var result = fruits.OrderBy(f => f, StringComparer.CurrentCulture); 

が正しいです。また:

CultureInfo culture = new CultureInfo("sv-SE"); 
var result = fruits.OrderBy(f => f, StringComparer.Create(culture, false)); 
+0

Yup、私はそれほど疑わしいです...私は単純化されたLINQクエリを使い続ける便利な方法があることを期待していました=) – Blixt

2

私はあなたのユースケースを試したし、それは(.NET 3.5および.NET 4.0の両方で)カルチャ固有の比較演算子を提供する必要なしに、有効な結果を提供しなかった:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("sv-SE"); 
    var fruits = new[] { "banan", "äpple", "apelsin", "druva" }; 
    var result = (from f in fruits orderby f select f).ToList(); 

    // outputs: apelsin, banan, druva, äpple 
    string resultsJoined = string.Join(", ", result); 
関連する問題