c# OrderBy string hierachy xx.xx.xx
本文关键字:xx hierachy string OrderBy | 更新日期: 2023-09-27 18:34:34
我有一个对象列表,我想使用 Option.Numero_Reference 属性对其进行排序。
问题是Numero_reference是xx.xx.xx格式的字符串
有没有办法按 xx 组对它们进行排序?
这是现在所做的,女巫不起作用:
myList.OrderByDescending(x => x.Option.Numero_Reference)
.ThenByDescending(x => x.Option.Numero_Reference.Substring(x.Option.Numero_Reference.IndexOf(".")))
这段代码给了我这样的东西:
- 3.9.6
- 3.9.2
- 3.8
- 3.7.2
- 3.6
- 3.17.5
- 3.17
- 3.16.4.7
- 3.11
- 3.10.1
当我应该有:
- 3.17.5
- 3.17
- 3.16.4.7
- 3.11
- 3.10.1
- 3.9.6
- 3.9.2
- 3.8
- 3.7.2
- 3.6
我们可以看到,基本字符串比较在第一点之后的第 10 个错误。
另一件事是,按点划分的组数是可变的,不遵循任何规则。
有人可以帮忙吗?
编辑
下面是版本解决方案的完整查询:
context.Options.Join(context.Categories_Options,
opt => opt.ID_Option,
cat_opt => cat_opt.ID_Option,
(opt, cat_opt) => new { Option = opt, Categories_Options = cat_opt })
.Where(x => x.Categories_Options.ID_Categorie == catId)
.OrderByDescending(x => new Version(x.Option.Numero_Reference))
.Select(x => x.Option)
.ToList();
这只给了我一个空列表。
您可以使用具有内置排序的Version
类:
myList.OrderByDescending(x => new Version(x.Option.Numero_Reference))
您可以使用
Version
类来表示这些字符串,并且Version
的比较方法应产生您期望的排序,而不是基于字典顺序。
myList.OrderByDescending(x => new Version(x.Option.Numero_Reference))
如果您确定永远不会有四个以上的组件,则可以按照其他答案的建议使用 Version 类。如果将有四个以上的组件,则可以执行以下操作之一:
- 实现
IComparer<T>
并使用需要 IComparer 的OrderBy<T>
重载 - 重构,使Numero_reference是一个自定义类(而不仅仅是一个字符串(,并使该类扩展
IComparable<T>
我想添加这个答案只是为了另一个参考。如果你的格式确实适合Version
数字的格式,其他答案是最好的,有了我的这个答案,你只需要知道每个地方的最大位数(用点分隔(和所有数字的最大位数:
//this can be used for the format from XX to XX.XX.XX.XX.XX.XX
var result = myList.OrderByDescending(x =>
string.Join("",x.Option.Numero_Reference.Split('.')
.Select(a=>a.PadLeft(2,'0')).ToArray()).PadRight(12,'0'));
//You can replace the 2 and 12 to the maximum number you want.