2015-05-29 96 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)的列表。