2010-08-12 166 views
27

我有兩個通用列表對象,其中一個包含ids和排序,另一個列表中的每個id都帶有一個id,第二個列表中有id引用,例如第一個列表;基於另一個列表的列表排序

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

很明顯,我可以通過做做一個簡單的排序OptionTypes的名單上

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

的問題是,雖然,我怎麼可能去利用下令「options_list「TYPE_ID」上與types_list的排序有關的對象。正如像(顯然這是無效的 - 但希望你會明白我的意思!)

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

我不明白,你能不能給我們的有序輸出可能是什麼樣子給一些輸入一個樣本? – 2010-08-12 17:05:48

回答

34

您應該能夠使用連接來產生所需的輸出。使用查詢語法的示例。

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

邦上錢,完美。非常感謝安東尼 – 2010-08-13 08:51:39

9

我喜歡Lambda語法,所以我想出了這個等價的東西。我可以看到如何查詢語法更清潔的連接。

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



對於略微下降(是什麼,我不知道),這將創建與剛剛訂購屬性的新對象,而不是整個Type類。這裏沒有太大的不同,但我有一個很大的類與排序數據,只需要排序屬性。不知道它是否重要,但閱讀更清晰。

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

它看起來像查詢語法可以讓您在初始查詢內進行排序,而lambda需要在連接創建新對象後進行排序。也許他們在封面下做着同樣的事情:創建連接的對象,進行排序然後選擇。

14

List.FindIndex()是你的朋友:

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

工作例如:https://dotnetfiddle.net/CpLeFU

+2

這真是太好了 – KDecker 2016-08-17 14:33:08

+2

這比連接要簡單得多。這假設listA已經按所需順序排序(type.Ordering)。也就是說,它使用listA在列表中的位置,而不是listA的屬性。它也在執行多重FindIndex,因此在大型列表中可能會出現性能問題。 – goodeye 2016-10-24 20:03:11

+2

非常簡單的一個班輪,對小列表來說表現似乎'夠好'。 – MaxJ 2016-12-02 15:18:22