2012-02-07 40 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();