2013-01-09 49 views
1

所以我有一个包含名为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 
+1

你是指从字符串的前两个字符开始按数字排序吗?或者模式比这更复杂? – MarcinJuraszek

+1

为什么12-030大于12-22? –

+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与你期望的结果。

+0

多数民众赞成在辉煌。像魅力一样工作。 –

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.

+0

是的。你是对的。短划线右侧的数字的前导零是什么抛出订单。人们被允许输入一个自定义的号码,我猜这就是数据如何以这种方式结束。我想我可以进去尝试清理这个,但是我担心系统会将12-030和12-30看作不同的数字,尽管它们是相同的。 –

相关问题