2012-02-07 78 views
3

我想排序一堆有排序顺序的对象,但是有些字段已经初始化为0,所以我想先显示所有用户/对象,它们有一个排序顺序(按照实际的正确顺序)然后显示,然后显示其他例如按大于0的排序顺序排序

我的名单

{id:4,name:"Tom", sortoder:0} 
{id:14,name:"Bee", sortoder:0} 
{id:401,name:"Mike", sortoder:1} 
{id:13582,name:"Monty", sortoder:2} 
{id:55,name:"Charlie", sortoder:0} 
{id:9,name:"Khan", sortoder:9} 

     var fields = GetFields(myobject) //get fields (not really relevant) 
        .OrderBy(x => x.sortoder > 0) //this is where I am stuck on 
        .ToList(); 

我的名单都dislaying用户0顶部,然后那些有排序顺序

回答

6

或者使用ThenBy后先申请第二顺序:

var fields = GetFields(myobject) 
    .OrderByDescending(x => x.SortOrder > 0) 
    .ThenBy(x => x.SortOrder) 
    .ToList(); 

或者你可以使用一个条件表达式来替换值为0 int.MaxValue(假设int.MaxValue不作为一个legi timate SortOrder的):

var fields = GetFields(myobject) 
    .OrderBy(x => x.SortOrder == 0 ? int.MaxValue : x.SortOrder) 
    .ToList(); 
+0

我怀疑任何数字将永远,但我真的很喜欢这种方法 – Haroon 2012-02-07 13:41:59

3

如何:

.OrderBy(x => x.sortorder != 0 ? x.sortoder : int.MaxValue) 

这基本上意味着 “把0作为一个特殊的价值,相当于int.MaxValue - 但除此之外,只要使用现有的排序顺序”。

马克的第一次排序的方法是“有一个排序顺序vs没有排序顺序”,然后是排序顺序值(对于第二组显然是0),它也可以很好地工作 - 这真的只是个人喜好的问题是你使用的方法。

+0

是不是周围的其他方式? – 2012-02-07 13:35:33

+0

@ vc74:是的,我正在编辑:) – 2012-02-07 13:36:40

+0

@JonSkeet - 通常我的对象很大(超过100-200) - 我的查询全部在内存中(即获取字段+排序),什么是您的建议或标记最好? – Haroon 2012-02-07 13:39:40

0

您可以实现的的IComparer或使用一个快速和肮脏的方式如下所示:

var fields = GetFields(myobject) //get fields (not really relevant) 
       .OrderBy(x => (x.sortoder == 0) ? int.MaxValue : x.sortoder) //this is where I am stuck on 
       .ToList();