.NET5.0对字符串比较中关于`IEnumerable<T>.OrderBy`行为的重大更改

c#

我有以下代码

    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}");
            }
        }
    }

在 .NET Core 3.1 和 2.1 中,它给出以下输出

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: 3

但是在 .NET 5.0 上,它给出以下输出

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

为什么会发生重大变化?

附加说明:即使使用OrderBy(x => x.OrderNumber, StringComparer.InvariantCultureIgnoreCase),这个问题仍然发生

回答

我猜这与使用 International Components for Unicode (ICU) 库作为默认值的更改有关。

您可以在此处具体阅读它,因为它会影响字符串比较:https : //docs.microsoft.com/en-us/dotnet/standard/base-types/string-comparison-net-5-plus

给出的示例用于对字符串进行排序。他们的示例是关于实例化 a SortedtSet<string>,但解决方案中的逻辑可以OrderBy通过提供您想要使用的显式比较器来扩展以涵盖您的使用。

这个例子:

//
// 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);


以上是.NET5.0对字符串比较中关于`IEnumerable&lt;T&gt;.OrderBy`行为的重大更改的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>