如何执行以下方案: 我有一些DataTable,其中包含一些行:
1.rowa
2.rowab
3.row
4.rowaba
...
ñ。 Rowabba
如何按行进行排序,而不是按名称排序。我想按字段长度排序表。
答案 0 :(得分:11)
您可以向DataTable
添加一个额外的列,提供一个包含对len()
函数调用的表达式,从而导致自动计算列的值:
table.Columns.Add("LengthOfName", typeof(int), "len(Name)");
然后,您可以在将DataTable
绑定到网格之前对您的新列进行排序,直到您计划使用的任何类型的UI控件:
table.DefaultView.Sort = "LengthOfName";
答案 1 :(得分:1)
如果必须使用DataTable
,您可以为排序引入额外的列。在这种情况下,您可以将列中的值简单地设置为每个所需单元格的长度,然后按新列排序:
DataTable table = new DataTable();
DataColumn val = table.Columns.Add("Value", typeof(string));
table.Rows.Add("abc");
table.Rows.Add("defgh");
table.Rows.Add("i");
table.Rows.Add("jklm");
// sort logic: ***** schou-rode's "len(...)" approach is better *****
DataColumn sort = table.Columns.Add("Sort", typeof(int));
foreach (DataRow row in table.Rows) {
row[sort] = ((string)row[val]).Length;
}
DataView view = new DataView(table);
view.Sort = "Sort";
foreach (DataRowView row in view) {
Console.WriteLine(row.Row[val]);
}
就个人而言,我会使用一个类型列表 - 在这种情况下是类或字符串(因为你只列出一个值):
List<string> list = new List<string> {
"abc", "defgh", "i", "jklm"};
list.Sort((x, y) => x.Length.CompareTo(y.Length));
foreach (string s in list) {
Console.WriteLine(s);
}