2015-05-29 91 views
0

我有两个列表。一个是动态的对象列表。另一个是字符串列表。我想根据另一个列表对对象列表进行排序。基于另一个列表对动态对象列表进行排序

List<dynamic> List1; // Object1,Object2,Object3,Object4 
List <String> List2; //"abc","bcd","da" 

这些对象具有必须对其进行排序的属性“字母”之一。

对象可能不等于第二个列表中的元素数。

+3

如果一个列表包含3个元素('List2'),另一个列表包含4个('List1'),则会很有趣:-) – xanatos

+0

不确定您对此的期望如何,没有多大意义。 –

+0

这里预计什么*确切*排序会如何影响任何事情? –

回答

0

如果这两个列表的索引与您希望的方式保持一致,那么可能会发生这样的情况。您必须确保列表具有相同的长度才能正常工作。

var result = list1 
    .Select((item, index) => 
     new 
     { 
      Item = item, 
      Order = list2[index] 
     }) 
    .OrderBy(x => x.Order) 
    .Select(x => x.Item); 

如果它们长度不一样,订单的标准是什么?那将是一个未定义的问题。一种方法是将它们放在列表的最后。

var result = list1.Take(list2.Length) 
    .Select((item, index) => 
    new 
    { 
     Item = item, 
     Order = list2[index] 
    }) 
    .OrderBy(x => x.Order) 
    .Select(x => x.Item); 
var concatted = result.Concat(list1.Skip(list2.Length)); 
+0

'list2 [index]' - “对象可能不等于第二个列表中的元素数量。”根据OP的帖子。 –

+0

一旦索引太大,这会抛出一个'IndexOutOfRange'。 OP声明列表不等长。 –

+0

在答案中注明。 – DLeh

0

好吧,假设列表1中包含对象的列表,每个对象包含称为“字母”的属性,并且要排序的对象的这份名单中,但排序顺序在列表2中指定其中有在排序顺序字母的可能值,那么你可以这样做:那么

int i=0; 
var List2WithRowNum = from str2 in List2.AsEnumerable() select new{ rowNum = i++, str2 }; 
var sortedList = from obj1 in List1.AsEnumerable() 
     join strKey in List2WithRowNum.AsEnumerable() on ((listObject)obj1).alphabet equals strKey.str2 
     orderby strKey.rowNum 
     select obj1; 

排序列表将是他们的“字母”属性排序,列表2为了您的原始对象(从列表1)的列表。