【问题标题】:Sorting of List<string> that has items containing both number and characters using LINQ's OrderBy is not working as expected [duplicate]使用 LINQ 的 OrderBy 对包含数字和字符的项目的 List<string> 进行排序未按预期工作 [重复]
【发布时间】:2019-07-08 07:29:20
【问题描述】:

我尝试了具有数字和字符的 C# 排序顺序。

List<EmployeesSTPList> employeeList = new List<EmployeesSTPList>();

employeeList.Add(new EmployeesSTPList { ID = "2", Name = "Employee 2" });
employeeList.Add(new EmployeesSTPList { ID = "1", Name = "Employee 1" });
employeeList.Add(new EmployeesSTPList { ID = "3", Name = "Employee 3" });
employeeList.Add(new EmployeesSTPList { ID = "10", Name = "Employee 10" });
employeeList.Add(new EmployeesSTPList { ID = "EMP002", Name = "Employee 02" });
employeeList.Add(new EmployeesSTPList { ID = "EMP003", Name = "Employee 03" });
employeeList.Add(new EmployeesSTPList { ID = "11", Name = "Employee 11" });
employeeList.Add(new EmployeesSTPList { ID = "4", Name = "Employee 4" });
employeeList.Add(new EmployeesSTPList { ID = "EMP010", Name = "Employee 010" });
employeeList.Add(new EmployeesSTPList { ID = "EMP001", Name = "Employee 01" });
employeeList.Add(new EmployeesSTPList { ID = "EMP011", Name = "Employee 011" });

employeeList = employeeList.OrderBy(a => a.ID, StringComparer.Ordinal).ToList();

foreach (var item in employeeList)
{
    <div> @item.ID</div>
}

输出是:

1
10
11
2
3
4
EMP001
EMP002
EMP003
EMP010
EMP011

但预期为,

1
2
3
4
10
11
EMP001
EMP002
EMP003
EMP010
EMP011

我已经尝试过使用 StringComparer.Ordinalstring[] 进行相同的操作,效果很好。但我的模型数据包含在列表中。

【问题讨论】:

  • 要获得自定义排序,您应该编写自定义比较器:stackoverflow.com/a/8975825/444165
  • 您必须搜索自然排序方案。这意味着您必须创建自己的比较器。
  • 不要使用重复问题的答案,使用 Windows API StrCmpLogicalW() for example, like this。 (注意:在 StackOverflow 上还有其他类似的答案使用 StrCmpLogicalW()。)

标签: c# linq sorting natural-sort


【解决方案1】:

StringComparer.Ordinal 在排序之前不检查字符串是否为数字。相反,它执行以下操作:

执行与语言无关的简单字节比较。这在比较以编程方式生成的字符串或比较区分大小写的资源(如密码)时最为合适。

您需要一个自定义的比较器来首先检查字符串是否为数字。可能使用正则表达式。

【讨论】:

  • 我认为这应该是一个评论。
  • 我不同意,他质疑为什么 StringComparer.Ordinal 不起作用,我回答。他问怎么做,我回答。仅仅因为我没有提供完整的工作代码示例并不意味着问题没有得到解答。
  • OP 没有问 “为什么 StringComparer.Ordinal 不起作用”,关于 StringComparer.Ordinal OP 说 “我已经尝试过与 @987654325 相同的操作@ 使用 StringComparer.Ordinal 工作正常。”。此外,恕我直言,您关于如何完成的回答非常抽象,并没有提供问题的必要答案(我并不是说这是错误的或其他什么)。
  • @SeM OP 肯定误会了 StringComparer.Ordinal,因为不管它是用于排序列表还是数组,它的工作原理都是一样的。在这两种情况下,它都不会按他的预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2020-12-12
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
相关资源
最近更新 更多