2

我有一个对象列表,我想使用 Option.Numero_Reference 属性对其进行排序。

问题是 Numero_reference 是 xx.xx.xx 格式的字符串

有没有办法按xx组排序?

这是a现在所做的,女巫不起作用:

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

这只会给我一个空列表。

4

4 回答 4

8

您可以使用Version具有内置排序的类:

myList.OrderByDescending(x => new Version(x.Option.Numero_Reference))
于 2013-10-09T20:41:30.137 回答
2

您可以使用Version该类来表示这些字符串,并且比较方法Version应该导致您期望的排序,而不是基于字典顺序。

myList.OrderByDescending(x => new Version(x.Option.Numero_Reference))
于 2013-10-09T20:41:37.707 回答
0

如果您确定永远不会超过四个组件,则可以按照其他答案的建议使用 Version 类。如果有四个以上的组件,您可以执行以下操作之一:

于 2013-10-09T20:55:36.547 回答
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.
于 2013-10-09T23:07:14.523 回答