2010-08-12 86 views
27

Tôi có hai đối tượng danh sách chung, trong đó có chứa id và thứ tự, và một số id khác với mỗi id trong danh sách thứ hai có tham chiếu id đến danh sách đầu tiên;Danh sách sắp xếp dựa trên danh sách khác

public class OptionType 
{ 
    public int ID { get; set; } 
    public int Ordering { get; set; } 
} 

public class Option 
{ 
    public int ID { get; set; } 
    public int Type_ID { get; set; } 
} 

Rõ ràng tôi có thể làm một loại đơn giản trên một danh sách các OptionTypes bằng cách làm

types_list.OrderBy(x => x.Ordering); 

Câu hỏi là, mặc dù làm thế nào tôi có thể đi về việc đặt mua một 'options_list' bằng cách sử dụng 'Type_ID' trên đối tượng liên quan đến thứ tự của types_list. Như trong một cái gì đó tương tự (rõ ràng điều này là không hợp lệ - nhưng hy vọng bạn sẽ có được ý tưởng!)

options_list.OrderBy(x => x.Type_ID == types_list.OrderBy(e => e.Ordering)); 
+3

Tôi không hiểu, bạn có thể cho chúng ta một mẫu của những gì đầu ra được sắp xếp có thể trông như đưa ra một số đầu vào? –

Trả lời

34

Bạn sẽ có thể sử dụng một tham gia để tạo ra sản lượng mong muốn của bạn. Ví dụ sử dụng cú pháp truy vấn.

var orderedOptions = from option in options_list 
        join type in types_list 
        on option.Type_ID equals type.ID 
        orderby type.Ordering 
        select option; 
+3

Bằng tiền, hoàn hảo. Cảm ơn rất nhiều Anthony –

9

Tôi thích cú pháp Lambda, vì vậy tôi nghĩ ra điều này tương đương. Tôi có thể xem cách cú pháp truy vấn sạch hơn cho các kết nối.

var orderedOptions = options_list 
    .Join(
     types_list, 
     option => option.Type_ID, 
     type => type.ID, 
     (option, type) => new { Option = option, Type = type }) 
    .OrderBy(x => x.Type.Ordering) 
    .Select(x => x.Option); 



Đối với việc giảm nhẹ (những gì, tôi không chắc chắn), điều này tạo ra các đối tượng mới chỉ với tài sản đặt hàng, thay vì toàn bộ lớp Type. Không có nhiều khác biệt ở đây, nhưng tôi đã có một lớp lớn với dữ liệu sắp xếp, và chỉ cần thuộc tính sắp xếp. Không biết nếu nó quan trọng, nhưng nó là rõ ràng hơn để đọc.

var orderedOptions = options_list 
    .Join(
     types_list, 
     option => option.Type_ID, 
     type => type.ID, 
     (option, type) => new { Option = option, Ordering = type.Ordering }) 
    .OrderBy(x => x.Ordering) 
    .Select(x => x.Option); 

Dường như cú pháp truy vấn cho phép bạn đặt hàng trong truy vấn ban đầu, trong khi lambda yêu cầu thứ tự sau khi kết nối tạo đối tượng mới. Có lẽ họ đang thực sự làm điều tương tự dưới vỏ bọc mặc dù: tạo đối tượng đã tham gia, để được sắp xếp rồi chọn.

14

List.FindIndex() là bạn của bạn:

var orderedB = listB.OrderBy(b => listA.FindIndex(a => a.id == b.id)); 

dụ làm việc: https://dotnetfiddle.net/CpLeFU

+2

Điều này là thực sự tốt đẹp – KDecker

+2

Điều này là đơn giản hơn nhiều so với tham gia. Điều này giả định listA đã được sắp xếp theo thứ tự mong muốn (type.Ordering). Nghĩa là, nó đang sử dụng vị trí của listA trong danh sách, không phải là một thuộc tính của listA. Nó cũng làm nhiều việc FindIndex, vì vậy có thể có một vấn đề hiệu suất trên các danh sách lớn. – goodeye

+2

Rất đơn giản một lớp lót, hiệu suất có vẻ 'đủ tốt' cho các danh sách nhỏ. – MaxJ

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