我有一个包含CustomerName和Age列的两列表。我拥有DataTable中的所有数据。我希望通过降序Age来对其进行排序,然后按名称对每个年龄组进行排序。因此,所有30岁的人都将按照所有人的名义进行分类,并在29岁至31岁之间的人员名单之间等。
我有:
string selectStatement = "Age";
string sortStatement = "Age DESC"
var rows = table.Select(selectStatement, sortStatement);
这应该按年龄排序。我还没想出如何按字母顺序对每个年龄组进行排序,但上面会抛出异常:
过滤器表达式'Age'不会计算为布尔项。
答案 0 :(得分:4)
但更好的是,你应该使用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 :(得分:1)
Select
的第一个参数应该是过滤表达式,而不是要选择的列列表。
答案 2 :(得分:1)
选择和排序是两回事。
您可以使用linq to dataset:
var rows = table.AsEnumerable().OrderByDescending(row => row.Field<int>("Age")).
ThenBy(row => row.Field<string>("Name"));
答案 3 :(得分:0)
这是因为DataTable.Select
方法用于过滤,而您的select语句不像SQL Select。
试试这个:
table.DefaultView.Sort = "Age DESC";
答案 4 :(得分:0)
您的 selectStatement 必须包含过滤器表达式。看看this。
因此,您的selectExpression可能是
string selectStatement = "Age > 0"; //if all people required
答案 5 :(得分:0)
过滤器arg可以作为null传递,因此不会应用过滤器填充,并且在排序中,您可以使用/不指定排序方向放置所需数量的列(默认为asc)。
根据我的经验,在大DataTables
上,Select比LINQ方法更快。
答案 6 :(得分:0)
DataView oDataSet; oDataSet.Tables [0] .DefaultView.Sort =“Column1 ASC”;