Làm cách nào để nhận danh sách tên riêng biệt, có thứ tự từ DataTable bằng LINQ?


104

Tôi có một DataTablevới một Namecột. Tôi muốn tạo một bộ sưu tập các tên duy nhất được sắp xếp theo thứ tự bảng chữ cái. Truy vấn sau bỏ qua mệnh đề thứ tự .

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

Tại sao orderbykhông được thực thi?

Câu trả lời:


37

Để làm cho nó dễ đọc và dễ bảo trì hơn, bạn cũng có thể chia nó thành nhiều câu lệnh LINQ.

  1. Đầu tiên, chọn dữ liệu của bạn vào một danh sách mới, hãy gọi nó x1, thực hiện phép chiếu nếu muốn
  2. Tiếp theo, tạo một danh sách riêng biệt, từ x1vào x2, sử dụng bất kỳ sự phân biệt nào bạn yêu cầu
  3. Cuối cùng, tạo một danh sách có thứ tự, từ x2vào x3, sắp xếp theo bất cứ thứ gì bạn muốn

55

Vấn đề là toán tử Distinction không cho rằng nó sẽ duy trì thứ tự ban đầu của các giá trị.

Vì vậy, truy vấn của bạn sẽ cần phải hoạt động như thế này

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

Hãy thử những điều sau:

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

3

Hãy thử những điều sau đây

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

điều này sẽ hoạt động cho những gì bạn cần.


2

Tóm lại: tất cả các câu trả lời đều có điểm chung.

OrderBy cần là thao tác cuối cùng.


2

Bạn có thể sử dụng một cái gì đó như thế:

dataTable.Rows.Cast<DataRow>().GroupBy(g => g["Name"]).Select(s => s.First()).OrderBy(o => o["Name"]);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.