2010-08-12 190 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