2013-01-08 84 views
0

我對Datatable中的排序有疑問。我有一個像下面這樣的桌子,並且希望將它從小到大排序。問題是當我有相同的數字,我想要第一個作爲最後一個等...使用相同的值對DataTable中的列進行排序

表:-------------------- ---------------排序後:

Name Bit Size      Name Bit  Size (corrected) 
A  0  1       A  0   1 
C  1  2       C  1   2 
B  1  3       B  1   3 
D  1  1       D  1   1 

結果,我想:

Name Bit Size (corrected) 
A  0  1 
D  1  1 
B  1  3 
C  1  2 

我的代碼:

arraySBit.DefaultView.Sort = "Bit"; 
arraySBit = arraySBit.DefaultView.ToTable(); 

回答

1

您可以使用Linq-To-DataTable

var tblSorted = table.AsEnumerable() 
        .OrderBy(r => r.Field<int>("Bit")) 
        .CopyToDataTable(); 

編輯:但實際上DataView.Sort也應努力(測試)。

由於您編輯了您的問題。您的需求似乎已被剔除。如果Bit是相同的,你不想通過某些東西來訂購,但是你想reverse等於行的行的「順序」(所以DataTable中的Ordinal位置)。

這你想要做什麼,儘管我不知道它確實是你所需要的:

DataTable tblSorted = table.AsEnumerable() 
       .Select((Row, Ordinal) => new {Row,Ordinal}) 
       .OrderBy(x => x.Row.Field<int>("Bit")) 
       .ThenByDescending(x => x.Ordinal) 
       .Select(x => x.Row) 
       .CopyToDataTable(); 

基本上它會透過此重載Enumerable.Select在表中的行的索引匿名類型。然後它將首先排序Bit,然後排序第二個。

+0

哪裏是大小排序嗎?他需要一點一點,然後按大小 –

+0

要挑剔這是Linq的數據集,但你無論如何得到+1;) –

+0

@RoyiNamir:你爲什麼認爲他想要按位和大小排序? –

0

一種解決方法,

這些線後,只要你想

DataTable arrySBitClone = arrySBit.Copy(); 
arrySBit.DefaultViewSort.Sort = "Bit"; 

bool different = false; 
for(int i=0; i<arrySBit.Rows.Count; i++) 
{ 
    if(arrySBit.Rows[i]["Bit"]!=arrySBitClone.Rows[i]["Bit"]) 
    { 
    difference = true; 
    break; 
    } 
} 

if(!different) 
{ 
    arrySBit = arrySBit.Copy(); 
} 
0

如果我得到正確你的問題,你應該有結果arrySBit。 爲什麼不使用Select?

DataTable dt = arraySBit.Select(「」,「Bit,Size」)。CopyToDataTable();

的選擇方法的第一個參數是過濾條件,第二個是一個ORDER BY,所以它應該工作

相關問題