Как получить отдельный упорядоченный список имен из DataTable с помощью LINQ?

104

У меня DataTableесть Nameколонка. Я хочу создать коллекцию уникальных имен, упорядоченных в алфавитном порядке. Следующий запрос игнорирует предложение order by .

var names =
    (from DataRow dr in dataTable.Rows
    orderby (string)dr["Name"]
    select (string)dr["Name"]).Distinct();

Почему orderbyне исполняется?

Боб
источник

Ответы:

37

Чтобы сделать его более читабельным и удобным, вы также можете разделить его на несколько операторов LINQ.

  1. Сначала выберите ваши данные в новый список, назовем его x1, при желании сделайте проекцию
  2. Затем создайте отдельный список от x1в x2, используя любое различие, которое вам нужно.
  3. И, наконец, создать упорядоченный список, из x2в x3, сортировка по что вы желаете
a7drew
источник
55

Проблема в том, что оператор Distinct не гарантирует, что он будет поддерживать исходный порядок значений.

Итак, ваш запрос должен работать так

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy( name => name );
Боб
источник
11
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Питер Мортенсен
источник
8

Попробуйте следующее:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Гэвин Фанг
источник
3

Попробуйте следующее

var names = (from dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy(name => name);

это должно работать для того, что вам нужно.

Ник Берарди
источник
2

Для абстракции: все ответы имеют что-то общее.

OrderBy должен быть последней операцией.

Филип Раат
источник
2

Вы можете использовать что-то вроде этого:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Престо
источник