Câu hỏi Nhiều đơn đặt hàng bằng LINQ [trùng lặp]


Câu hỏi này đã có câu trả lời ở đây:

Tôi bắt đầu với một lớp cơ bản mà tôi muốn thao tác trong một List sử dụng LINQ, giống như sau:

public class FooBar   
{  
    public virtual int Id { get; set; }  
    public virtual string Foo{ get; set; }  
    public virtual string Bar{ get; set; }
}

Đây là những gì tôi cuối cùng phát hiện ra để giải quyết vấn đề của tôi bằng cách sử dụng các công cụ LINQ không lambda.

// code somewhere else that works and gets the desired results  
var foobarList = GetFooBarList();  // Abstracted out - returns List<Foobar>  

// Interesting piece of code that I want to examine
var resultSet = from foobars in foobarList  
                orderby foobars.Foo, foobars.Bar  
                select foobars;

// Iterate and do something interesting  
foreach (var foobar in resultSet)  
{  
    // Do some code  
}

Những gì tôi thực sự tò mò về là nếu cùng có thể được thực hiện bằng cách sử dụng các phương pháp mở rộng dựa trên Lambda tắt của chung IEnumerable để thực hiện điều tương tự. Google nói với tôi rằng tôi có thể làm một việc như sau để hoàn thành nó

var resultSet = foobarList.OrderBy(x => new {x.Foo, x.Bar})  
                          .Select(x=>x);

Tuy nhiên nếu tôi làm điều đó tôi nhận được một lỗi thời gian chạy khi tôi nhấn tuyên bố foreach. Lỗi này cho tôi biết rằng ít nhất một đối tượng phải triển khai IComparible, mà tôi có thể thấy rằng vì tôi đang sử dụng một kiểu ẩn danh cho phương thức .OrderBy ().

Vì vậy, có cách nào để hoàn thành những gì tôi muốn bằng cách sử dụng cách Lambda?


188
2018-02-23 14:35


gốc


Nếu bạn muốn biết "phương pháp thông thạo" tương ứng với mọi biểu thức truy vấn có thể có, hãy đọc phần 7.15.2 của đặc tả. - Eric Lippert
@Eric Lippert, có một bản dịch truy vấn biểu thức truy vấn C # 3.0, được viết bởi Bart Desmet, mà tôi thấy rất hữu ích như một tài liệu tham khảo nhanh: bartdesmet.net/blogs/bart/archive/2008/08/30/… . - Pop Catalin


Các câu trả lời:


Bạn có thể dùng ThenBy và ThenByDescending phương pháp mở rộng:

foobarList.OrderBy(x => x.Foo).ThenBy( x => x.Bar)

442
2018-02-23 14:37



Đoán tôi hoàn toàn nên có được thông qua các API trước khi đặt câu hỏi;) Nó cũng có vẻ như bạn có thể chuỗi. Sau đó () báo cáo nhiều lần như bạn cần. Cảm ơn một lần nữa! - sdanna
Thế còn .AndThen() - Brock Hensley
No .AndThen()! - Valamas
(Hàm AndThen () {AndThen ()}) () - masteroleary
Tôi từ chối chơi trò chơi tâm trí LINQ của bạn! - Richnau