我有一个对象列表,我想使用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(".")))
这段代码给了我类似的东西:
当我应该有:
我们可以看到,基本字符串比较在第一点之后第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();
这只给我一个空列表。
答案 0 :(得分:8)
您可以使用具有内置排序的Version
类:
myList.OrderByDescending(x => new Version(x.Option.Numero_Reference))
答案 1 :(得分:2)
您可以使用Version
类来表示这些字符串,Version
的比较方法应该产生您期望的排序,而不是基于字典顺序。
myList.OrderByDescending(x => new Version(x.Option.Numero_Reference))
答案 2 :(得分:0)
如果您确定永远不会有超过四个组件,则可以使用Version类,如其他答案所示。如果有超过四个组件,您可以执行以下操作之一:
IComparer<T>
并使用带有IComparer的overload of OrderBy<T>
IComparable<T>
答案 3 :(得分:0)
我想补充一下这个答案,仅供参考。如果您的格式与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.