Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort DataTable rows by length in c#

Tags:

c#

.net

datatable

How to do following scenario: I have some DataTable which contains for example some rows:

1.rowa
2.rowab
3.row
4.rowaba
...
n. rowabba

How to sort rows by lenght, not by name. I wan to to sort Table by length of fields.

like image 482
nemke Avatar asked Dec 18 '22 07:12

nemke


2 Answers

You could add an extra column to your DataTable, supplying an expression containing a call to the len() function, causing the column's values to be automatically computed:

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

Then you can simply sort on your new column before binding the DataTable to a grid to whatever kind of UI control you plan to use:

table.DefaultView.Sort = "LengthOfName";
like image 100
Jørn Schou-Rode Avatar answered Dec 29 '22 18:12

Jørn Schou-Rode


If you must use DataTable, you could introduce an extra column for the sort. In this case, you could set the value in the column simply to the length of each desired cell, and then sort by the new column:

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

Personally, I'd use a typed list - of either a class, or a string in this case (since you only list one value):

        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);
        }
like image 29
Marc Gravell Avatar answered Dec 29 '22 20:12

Marc Gravell