2015-12-08 14 views
6

Tôi đã tạo một hàm để lọc và sắp xếp nội dung của danh sách.Kết hợp nhiều LINQ Trường hợp câu lệnh

Có vẻ như hơi 'bitty', tuy nhiên LINQ không phải là điểm mạnh. Tôi tự hỏi liệu chức năng có thể được sắp xếp hợp lý hay không, từ quan điểm hiệu suất hoặc thậm chí phối cảnh kinh ngạc.

Dưới đây là các mã:

// deserialise XML để tạo ra một lớp hàng hoạt động

var agents = XmlHelper 
     .Deserialise<AgentConfigs>("~/Pingtree.xml") 
     .Agents 
     .Where(x => x.IsActive == true); 

// Đầu tiên - nhận đại lý và sắp xếp chúng 'trực tiếp'

var direct = agents 
     .Where(x => x.IsDirect) 
     .OrderByDescending(x => x.MinPrice); 

// Thứ hai - nhận các đại lý gián tiếp và yêu cầu họ

var agency = agents 
     .Where(x => !x.IsDirect) 
     .OrderBy(x => x.Priority); 

// bolt 2 danh sách con với nhau, duy trì trật tự

Agents = direct.Concat(agency).ToList(); 

Bất kỳ suy nghĩ về cách thức này có thể được cải thiện?

+1

Shopuld có thể truy cập http://codereview.stackexchange.com/ – HimBromBeere

+0

Nếu giải pháp hoạt động tốt và bạn muốn cải thiện/xem xét cách nó có thể được xây dựng tốt hơn, hãy đăng lên http://stackoverflow.com/review –

+0

Trước hết bạn lặp lại cùng một danh sách nhiều lần được đánh dấu bằng Resharper ví dụ Điều này có thể gây ra các vấn đề về hiệu suất và có thể dễ dàng tránh được bằng cách gọi '.ToList' trên các tác nhân của bạn trước khi thực hiện các truy vấn thêm. – HimBromBeere

Trả lời

5

Bạn có thể sử dụng GroupBy hoặc ToLookup chia cả hai, tôi thích ToLookup trong trường hợp này:

var activeAgentDirectLookup = XmlHelper 
    .Deserialise<AgentConfigs>("~/Pingtree.xml") 
    .Agents 
    .Where(x => x.IsActive == true) 
    .ToLookup(a => a.IsDirect); 

Agents = activeAgentDirectLookup[true].OrderByDescending(x => x.MinPrice) 
    .Concat(activeAgentDirectLookup[false].OrderBy(x => x.Priority)) 
    .ToList(); 

Một lookup cũng tương tự như một cuốn từ điển với một bool như chìa khóa trong trường hợp này (vì vậy hai nhóm có thể). Giá trị là IEnumerable<Agents>, vì vậy tất cả các đại lý là IsDirect hoặc !IsDirect. Lợi ích ở đây là bạn chỉ cần đánh giá nó một lần.

+0

Cảm ơn bạn đã trả lời Tim. Tôi bị bối rối bởi mã - xin vui lòng bạn có thể chú thích những gì các bit làm. –

+1

Tra cứu tương tự với từ điển có khóa 'bool' (do đó có thể có hai nhóm). Các giá trị là 'IEnumerable ', vì vậy tất cả các tác nhân là 'IsDirect' hoặc'! IsDirect'. Lợi ích ở đây là bạn chỉ cần đánh giá nó một lần. –

+0

Ah, hãy ya ngay bây giờ - giải pháp tốt đẹp! –

Các vấn đề liên quan