Как получить отдельный упорядоченный список имен из 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, сортировка по что вы желаете

55

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

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

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).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"]);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.