代码之家  ›  专栏  ›  技术社区  ›  nemke Todd Stout

在c中按长度对数据表行排序#

  •  4
  • nemke Todd Stout  · 技术社区  · 15 年前

    如何执行以下场景: 我有一些数据表,其中包含例如一些行:

    1.rowa

    3.row
    4.rowaba

    N罗瓦巴

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

    2 回复  |  直到 15 年前
        1
  •  11
  •   Jørn Schou-Rode dscher    15 年前

    您可以在列表中添加一个额外的列 DataTable ,提供包含对 len() 函数,导致自动计算列的值:

    table.Columns.Add("LengthOfName", typeof(int), "len(Name)");
    

    然后,您只需在绑定前对新列进行排序即可 数据表 到网格到您计划使用的任何类型的UI控件:

    table.DefaultView.Sort = "LengthOfName";
    
        2
  •  1
  •   Marc Gravell    15 年前

    必须 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);
            }