在c#中按长度对DataTable行进行排序

时间:2009-06-26 08:29:36

标签: c# .net datatable

如何执行以下方案: 我有一些DataTable,其中包含一些行:

  

1.rowa
  2.rowab
  3.row
  4.rowaba
  ...
  ñ。 Rowabba

如何按行进行排序,而不是按名称排序。我想按字段长度排序表。

2 个答案:

答案 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);
        }