Tengo el siguiente código
public class Model { public int Id { get; set; } public string OrderNumber { get; set; } } class Program { static void Main(string[] args) { var models = new List<Model> { new Model {Id = 4, OrderNumber = "BT-3964-1"}, new Model {Id = 2, OrderNumber = "BT3924"}, new Model {Id = 1, OrderNumber = "bt3810v2"}, new Model {Id = 5, OrderNumber = "BILL-TEST100"}, new Model {Id = 3, OrderNumber = "BT-4887-Test3-Create"} }; var reorderedModels = models.OrderBy(x => x.OrderNumber); Console.WriteLine("The sorted models are:"); foreach (var model in reorderedModels) { Console.WriteLine($"OrderNumber: {model.OrderNumber}, Id: {model.Id}"); } } }En .NET Core 3.1 y 2.1, da el siguiente resultado
The sorted models are: OrderNumber: BILL-TEST100, Id: 5 OrderNumber: bt3810v2, Id: 1 OrderNumber: BT3924, Id: 2 OrderNumber: BT-3964-1, Id: 4 OrderNumber: BT-4887-Test3-Create, Id: 3Pero en .NET 5.0, da el siguiente resultado
The sorted models are: OrderNumber: BILL-TEST100, Id: 5 OrderNumber: BT-3964-1, Id: 4 OrderNumber: BT-4887-Test3-Create, Id: 3 OrderNumber: bt3810v2, Id: 1 OrderNumber: BT3924, Id: 2¿Por qué los cambios de última hora?
Nota adicional : incluso usando OrderBy(x => x.OrderNumber, StringComparer.InvariantCultureIgnoreCase) , este problema aún ocurre
Supongo que tiene algo que ver con el cambio para usar las bibliotecas de Componentes Internacionales para Unicode (ICU) como predeterminadas.
Puede leer sobre esto específicamente, ya que afecta la comparación de cadenas aquí: https://docs.microsoft.com/en-us/dotnet/standard/base-types/string-comparison-net-5-plus
Un ejemplo dado es para ordenar cadenas. Su ejemplo se trata de instanciar un SortedtSet<string> , pero la lógica en la solución se puede ampliar para cubrir su uso de OrderBy al proporcionar el comparador explícito que desea usar.
El ejemplo:
// // Potentially incorrect code - behavior might vary based on locale. // SortedSet<string> mySet = new SortedSet<string>(); List<string> list = GetListOfStrings(); list.Sort(); // // Corrected code - uses ordinal sorting; doesn't vary by locale. // SortedSet<string> mySet = new SortedSet<string>(StringComparer.Ordinal); List<string> list = GetListOfStrings(); list.Sort(StringComparer.Ordinal);Lo que dijo @Loggar y para su caso específico para obtener un comportamiento consistente, el cambio será pasar el comparador de cadenas a OrderBy :
.OrderBy(x => x, StringComparer.InvariantCultureIgnoreCase)