2009-12-04 7 views
18

Di Tengo una lista de cadenas con palabras suecas: banan, äpple, apelsin, druva¿Cómo puedo obtener LINQ para ordenar según la cultura?

Ahora quiero conseguir esta lista ordenada (hay que tener en cuenta que esta es una versión muy simplificada de la consulta real) :

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

Esto me dará: apelsin, äpple, banan, druva. Sin embargo, de acuerdo con el alfabeto sueco, que debería obtener: apelsin, banan, druva, äpple

He intentado cambiar System.Threading.Thread.CurrentThread.CurrentCulture a sv-SE pero eso no pareció afectar realmente a él en absoluto. ¿Tengo que escribir mi propia función lambda y usar .OrderBy(...) o hay algo más que pueda hacer para mantener intacto el LINQ?

+0

I Sé que esta es una vieja pregunta Y que mi comentario no es exacto sobre lo que preguntaste. También tuve problemas con la clasificación de datos de la base de datos que venía de Entity Framework a través de linq. Me di cuenta de que tenía un conjunto de colación incorrecto en mi base de datos. Lo cambié a danés y la clasificación funcionó correctamente de nuevo. –

Respuesta

32

No se puede hacer esto con una expresión de consulta, pero puede hacerlo con la notación punto explícito:

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

Eso debería hacerlo, asumiendo la cultura actual del hilo es correcta. Alternativamente:

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

Sí, sospechaba tanto ... Esperaba que hubiera una manera conveniente de seguir usando la consulta LINQ simplificada =) – Blixt

2

He probado su caso de uso, y sí ofrece resultados válidos sin necesidad de proporcionar comparador específico de la cultura (tanto en .NET 3.5 y .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); 
Cuestiones relacionadas