You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET不同版本下DataView按GoodsNo排序结果差异原因咨询

DataView在.NET 2.0与.NET 8.0中字符串排序差异的原因

问题现象

当DataView的GoodsNo列包含HB3-T017和HB-T015两条数据,按GoodsNo排序时,两个.NET版本得到完全相反的结果:

  • .NET 2.0排序结果:HB3-T017在前,HB-T015在后
  • .NET 8.0排序结果:HB-T015在前,HB3-T017在后

测试代码

创建DataTable的代码:

DataTable dt = new DataTable();
dt.Columns.Add("GoodsNo", typeof(string));

DataRow dr = dt.NewRow();
dr["GoodsNo"] = "HB3-T017";
dt.Rows.Add(dr);

dr = dt.NewRow();
dr["GoodsNo"] = "HB-T015";
dt.Rows.Add(dr);

按GoodsNo排序的代码:

DataView dv = new DataView(dt, "", "GoodsNo", DataViewRowState.CurrentRows);

版本结果对比

.NET 2.0排序结果

GoodsNo
HB3-T017
HB-T015

.NET 8.0排序结果

GoodsNo
HB-T015
HB3-T017

差异原因

核心原因是两个.NET版本使用了不同的底层字符串排序实现库:

  • .NET 2.0属于.NET Framework系列,默认使用Windows系统自带的NLS(National Language Support)排序库。NLS的排序逻辑在处理符号与数字混合的字符串时,采用旧的区域设置规则,在比较HB3-T017和HB-T015时,会将数字3的权重判定为高于符号-,导致HB3-T017排在前面。
  • .NET 8.0属于.NET Core/.NET 5+系列,默认使用ICU(International Components for Unicode)排序库。ICU严格遵循Unicode标准排序规则,符号-的排序优先级高于数字3,因此HB-T015会排在HB3-T017之前,结果更符合直观的排序预期。

从.NET Core开始,微软全面切换到ICU库,目的是让跨平台的排序行为保持一致,同时对齐Unicode标准,解决NLS在不同系统、不同区域设置下排序行为不一致的问题。

内容的提问来源于stack exchange,提问作者Tian戊辰

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:55:01