C # сортировка таблицы по 2 колонкам - PullRequest
5 голосов
/ 30 ноября 2011

У меня есть таблица из двух столбцов, содержащая столбцы CustomerName и Age.У меня есть все данные в DataTable.Я хочу отсортировать его по убыванию возраста, а затем каждая возрастная группа сортируется по имени.Таким образом, все люди в возрасте 30 лет будут отсортированы по алфавиту и будут находиться в списках людей в возрасте от 29 до 31 года и т. Д.

У меня есть:

string selectStatement = "Age";
string sortStatement = "Age DESC"

var rows = table.Select(selectStatement, sortStatement);

Это должно быть отсортировано по возрасту.Я не выяснил, как отсортировать каждую возрастную группу по алфавиту, но вышеприведенное выдает исключение:

Выражение фильтра «Возраст» не соответствует булеву термину.

Ответы [ 7 ]

4 голосов
/ 30 ноября 2011

Как сказал @adrift. Вы должны отправить выражение фильтра (которое оценивается как логическое) в качестве первого аргумента. Попробуйте отправить туда ноль и пустую строку, возможно, Select проигнорирует аргумент. Или дать ему какое-нибудь тривиальное выражение, например 0 <1. И затем в порядке по частям вы можете просто разделить несколько полей запятыми: «Age Desc, Name». </p>

Но еще лучше, вы должны использовать класс DataView. Как это:

var dt = new DataTable(); // your data.
var view = new DataView(dt);
view.Sort = "Age desc, Name asc";

Затем вы можете установить этот класс как источник данных для некоторых элементов управления и т. Д. Он будет возвращать строки в правильном порядке. Или вы можете просто использовать foreach для перебора строк.

foreach (DataRowView dr in view)
{
    //do what you like
}
1 голос
/ 30 ноября 2011

Выбор и сортировка - это две разные вещи.

Вы можете использовать linq для набора данных :

var rows = table.AsEnumerable().OrderByDescending(row => row.Field<int>("Age")).
                                ThenBy(row => row.Field<string>("Name"));
1 голос
/ 30 ноября 2011

Первый аргумент Select должен быть выражением фильтра, а не списком столбцов для выбора.

0 голосов
/ 25 января 2017

DataView oDataSet; oDataSet.Tables [0] .DefaultView.Sort = "Column1 ASC";

0 голосов
/ 07 января 2015

Аргумент фильтра может быть передан как ноль, так что фильтрация не будет применена, и в сортировке вы можете поместить столько столбцов, сколько вам нужно, без указания направления сортировки (по умолчанию asc). По моему опыту, на больших DataTables выбор идет быстрее, чем подход LINQ.

0 голосов
/ 30 ноября 2011

Ваш selectStatement должен содержать выражение фильтра .Посмотрите на это .

Итак, ваше выражение selectExpression может быть

string selectStatement = "Age > 0"; //if all people required
0 голосов
/ 30 ноября 2011

Это связано с тем, что метод DataTable.Select предназначен для фильтрации, а оператор выбора не похож на SQL Select.

Попробуйте:

...