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?

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

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 );

11
var sortedTable = (from results in resultTable.AsEnumerable()
select (string)results[attributeList]).Distinct().OrderBy(name => name);

8

Coba yang berikut ini:

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

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.


2

Untuk abstrak: semua jawaban memiliki kesamaan.

OrderBy harus menjadi operasi terakhir.


2

Anda dapat menggunakan sesuatu seperti itu:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.