2011-11-30 109 views
5

我有一個包含CustomerName和Age列的兩列表。我擁有DataTable中的所有數據。我想按降序排列年齡,然後每個年齡組按名稱排序。所以,30歲的所有的人將被alpabetically排序,併成爲29和31等C#按2列排序表

老年人列表間我有:

string selectStatement = "Age"; 
string sortStatement = "Age DESC" 

var rows = table.Select(selectStatement, sortStatement); 

這應該按年齡排序。我還沒有想出如何按字母順序對每個年齡段進行排序,但上面會引發異常:

過濾器表達式「Age」不計算爲布爾項。

回答

3

就像@adrift說。你應該發送一個過濾器表達式(評估爲布爾值)作爲第一個參數。嘗試發送null和一個空字符串,也許Select將忽略參數。或者給它一些簡單的表達式,如0 < 1.然後按照部分的順序,您可以用逗號分隔幾個字段:「Age Desc,Name」。

但更好的是,你應該使用DataView類。像這樣:

var dt = new DataTable(); // your data. 
var view = new DataView(dt); 
view.Sort = "Age desc, Name asc"; 

然後,您可以將此類設置爲某些控件等的數據源。它將以正確的順序返回行。 或者你可以簡單地使用foreach遍歷行。

foreach (DataRowView dr in view) 
{ 
    //do what you like 
} 
1

Select的第一個參數應該是過濾器表達式,而不是要選擇的列的列表。

0

這是因爲DataTable.Select方法用於篩選,而您的select語句不像SQL Select。

試試這個:

table.DefaultView.Sort = "Age DESC"; 
0

selectStatement必須包含過濾器表達式。看看this

所以,你selectExpression可能是

string selectStatement = "Age > 0"; //if all people required 
1

選擇和排序是兩回事。

你可以使用linq to dataset

var rows = table.AsEnumerable().OrderByDescending(row => row.Field<int>("Age")). 
           ThenBy(row => row.Field<string>("Name")); 
0

過濾ARG可以爲null傳入所以沒有過濾填充應用,並在排序,你可以把你想要使用/儘可能多列,而無需指定排序方向(默認爲asc)。 根據我的經驗,在大DataTables選擇比LINQ方法更快。

0

DataView oDataSet; oDataSet.Tables [0] .DefaultView.Sort =「Column1 ASC」;