Як отримати чіткий упорядкований список імен із DataTable за допомогою LINQ?


104

У мене є DataTableз Nameколонкою. Я хочу створити колекцію унікальних імен, упорядкованих за алфавітом. Наступний запит ігнорує порядок за пунктом.

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.