无法通过数字字符串值属性对对象集合进行排序

时间:2013-01-09 21:54:12

标签: c# asp.net c#-4.0 collections

所以我有一个包含名为myNumber的属性的类。它看起来像这样:

public class MyThing
{
    public int name{ get; set; }
    public string myNumber{ get; set; }
}

myNumber中包含的值可能如下12-2412-024

我想通过myNumber降序来订购这些对象的集合(IEnumerable<MyThing> myCollection),但我不知道如何去做。

我试过myCollection.OrderByDescending(f => f.myNumber),但这并不是我所期待的。我希望12-22, 13-01, 12-030能够像这样订购:

13-01 
12-030
12-22

2 个答案:

答案 0 :(得分:2)

您可以像Version一样订购。因此,您可以按'-'拆分,并将第一部分用作主要部分,将最后部分用作次要版本:

var orderedLikeVersion = myCollection
    .Select(t => new
    {
        Thing = t,
        Parts = t.myNumber.Split('-')
    }).Select(x => new
    {
        x.Thing,
        Version = new Version(int.Parse(x.Parts[0]), int.Parse(x.Parts[1]))
    })
    .OrderByDescending(x => x.Version)
    .Select(x => x.Thing);

Demo以及您想要的结果。

答案 1 :(得分:0)

我猜你得到了这个订单?

13-01 
12-22
12-030

按字母惯例这是正确的。 12-2 *大于12-0 *因为2在0之后。

似乎似乎正确的数字约定,因为22也大于03,而2大于0。

所以我不确定你的预期顺序,为什么你将12-030解释为大于12-22?连字符后面的部分应该允许前导零被截断吗?如果你这样做,那么12-30将等于12-030,我会问自己,领先0的目的是什么。