2012-09-26 49 views
1

我有一個DataSet包含一列,稱其爲Type其中包含ints。我使用LINQ來操作DataSet,我想按Type排序。 Type列現在僅包含3個值(1,2,3)。我想排序,以便Type 2首先在列表中,然後是1和3.LINQ OrderBy有一個例外

是否有一個簡單的解決方案,或者我將不得不自定義OrderBy?

+0

的可能重複[LINQ的排序依據針對特定值(http://stackoverflow.com/questions/728319/linq-orderby-against-specific-values) – James

回答

5

幾個解決方案:

table.AsEnumerable() 
.OrderBy(r => r.Field<int>("Type")==2 ? 0 : 1) 
.ThenBy(r => r.Field<int>("Type")); 

或可能更好

table.AsEnumerable(). 
OrderBy(r => r.Field<int>("Type")==2 
    ? 0 
    : r => r.Field<int>("Type")) 

或也優雅添Schmelter的解決方案

table.AsEnumerable() 
.OrderByDescending(r => r.Field<int>("Type")==2) 
.ThenBy(r => r.Field<int>("Type")) 

優勢或添Schmelter的解決方案:你不是取決於「僞價值」。

在兩個第一個解決方案中,我們聲明0是((該字段的最小可能值)-1)。

這是真的嗎,它可以改變,我們不知道。

+0

+1 - 我會選擇第二個選項。 – RedFilter

+1

而不是pseeudocode我會添加實際代碼:'table.AsEnumerable()。OrderByDescending(r => r.Field (「Type」)== 2)。ThenBy(r => r.Field (「Type」)) )' –

+0

@TimSchmelter爵士是的,先生;) –

0

爲了讓我刪除,我們從數據表開始的事實,樣品簡單,它只是一個細節,我想我們可以做到這一點:

var list = new [] { 1, 3, 5, 2, 4, 6, 9, 8 }; 
var sorters = new [] { 3, 2, -1 }; 

var o = from s in sorters 
     from l in list.OrderBy(x => x) 
     where s == l || (s == -1 && !sorters.Contains(l)) 
     select l; 

排序數組包含首選分揀機,這種方式如果我們需要它們,我們可以有多個,然後有一個'快樂'(-1)代表分揀機的結束。快樂可以以更好的方式處理,就像給你想法一樣。此時該算法是通用的,不需要對首選值進行任何硬編碼檢查(只是快樂)。

存在一些潛在的低效率問題,但我只想說明這個解決方案的總體思路,以及更多的工作可以更有效地完成。

0

在這裏你有5種方法來完成這一點。這是一篇關於如何設置價值作爲第一個訂單,然後扔在那些較低,並在高於所選的所以如果你有{1 2 3 4 5 6}和選擇項目,輸出:{4 1 2 3 5 6} ..我更喜歡我自己的答案,但..^_^

https://stackoverflow.com/a/12580121/920359