使用c#按长度对DataTable行进行排序

4
如何执行以下场景: 我有一些包含例如以下行的DataTable:
1.rowa 2.rowab 3.row 4.rowaba ... n. rowabba
如何按长度而不是名称对行进行排序。我想通过字段长度对表进行排序。
2个回答

11

你可以向你的DataTable中添加一个额外的列,提供一个包含调用len()函数的表达式,从而导致该列的值被自动计算:

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

然后,您可以在将DataTable绑定到您计划使用的任何类型的UI控件之前,对您的新列进行排序:

table.DefaultView.Sort = "LengthOfName";

我喜欢 "len(Name)" 这个函数,它展示了我使用 DataTable 的频率... +1 - Marc Gravell
3
很好,我不知道你可以在DataTable中使用计算列。+1 - Doctor Jones
我知道你可以使用表达式,但我还没有尝试过。http://msdn.microsoft.com/zh-cn/library/system.data.datacolumn.expression%28VS.80%29.aspx - maxwellb

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

我同意,最简单的方法是在数据集查询中添加一个类似于LENGTH(field)或LENGTH(field1 || field2 || ... || fieldN)的字段。 - Jonathan
或者如果你真的真的不能添加列,通过迭代器将行读入List<object[]>中。对列表进行排序,然后在清空表格后重新添加回去。Marc,感谢lambda表达式。我仍然在使用C# 2,并编写了一个实现Compare方法的测试类。天啊,这些lambda表达式确实节省了很多代码行...哇。 - maxwellb
谢谢你的回答,我也会使用类型化列表,但是我现在卡在这段代码上了,而且它需要昨天就能工作 :). 如果我现在改成类型化列表,我需要改很多代码。 - nemke
我的DataTable不仅包含一个值。它有很多值,但我需要按某个键的长度对其进行排序,以便稍后可以使用String.Contains("jklm")... - nemke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接