Bagaimana cara mendapatkan daftar nama yang berbeda dan diurutkan dari DataTable menggunakan LINQ?

104

Saya memiliki DataTabledengan Namekolom. Saya ingin membuat kumpulan nama unik yang diurutkan menurut abjad. Kueri berikut mengabaikan urutan menurut klausa.

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

Mengapa tidak orderbydiberlakukan?

Bob
sumber

Jawaban:

37

Agar lebih mudah dibaca dan dipelihara, Anda juga dapat membaginya menjadi beberapa pernyataan LINQ.

  1. Pertama, pilih data Anda ke dalam daftar baru, sebut saja x1, lakukan proyeksi jika diinginkan
  2. Selanjutnya, buat daftar berbeda, dari x1dalam x2, menggunakan perbedaan apa pun yang Anda butuhkan
  3. Akhirnya, membuat daftar memerintahkan, dari x2dalam x3, menyortir oleh apa pun yang Anda inginkan
a7drew
sumber
55

Masalahnya adalah bahwa operator Distinct tidak menjamin akan mempertahankan urutan nilai aslinya.

Jadi kueri Anda harus berfungsi seperti ini

var names = (from DataRow dr in dataTable.Rows
             select (string)dr["Name"]).Distinct().OrderBy( name => name );
Bob
sumber
11
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);
Peter Mortensen
sumber
8

Coba yang berikut ini:

dataTable.Rows.Cast<DataRow>().select(dr => dr["Name"].ToString()).Distinct().OrderBy(name => name);
Gavin Fang
sumber
3

Coba berikut ini

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

ini harus bekerja untuk apa yang Anda butuhkan.

Nick Berardi
sumber
2

Untuk abstrak: semua jawaban memiliki kesamaan.

OrderBy harus menjadi operasi terakhir.

Philip Raath
sumber
2

Anda dapat menggunakan sesuatu seperti itu:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Presto
sumber