Tengo un servidor Windows 2019 (configurado en en-US para todas las configuraciones de idioma) para el cual se encuentra el siguiente código:
var unsorted = new[] {"Aldi", "Al-Murad Tiles", "AliExpress" }; Console.WriteLine("Unsorted: " + string.Join(',', unsorted)); var sorted = unsorted.OrderBy(x => x); Console.WriteLine("Sorted: " + string.Join(',', sorted));Produce:
Tengo una máquina con Windows 11 (configurada en en-GB para todas las configuraciones de idioma) para la cual se produce el mismo código:
No hace ninguna diferencia si configuro la cultura del hilo actual para que sea la misma que la del servidor:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");¿Alguien sabe qué configuración se debe aplicar al subproceso actual para que el código existente se clasifique de la misma manera en la máquina con Windows 11 que en el servidor?
(vale la pena decir que este es un ejemplo extraído de una base de código heredada mucho más grande, por lo que me gustaría hacer cambios mínimos en el código para afectar el subproceso/contexto/entorno actual para que esta clasificación funcione en lugar de refactorizar el código existente)
En .NET 5, las API de globalización ahora usan bibliotecas ICU, en lugar de NLS, en Windows , por lo que si una de sus máquinas se ejecuta en .NET 5 y la otra ejecuta una versión anterior, esto podría explicar por qué cambiar el subproceso actual. La información cultural no ayuda en absoluto.
Puedes usar una comparación Ordinal :
var sorted = unsorted.OrderBy(x => x, StringComparer.Ordinal);Alternativamente, también puede hacer que su aplicación .NET 5 use NLS editando runtimeconfig.json
"configProperties": { "System.Globalization.UseNls": "true" } O configurando la variable de entorno DOTNET_SYSTEM_GLOBALIZATION_USENLS .