2013-10-16 187 views
0

我需要根據每個列表中的對象的不同屬性(一個列表中的對象具有targetId屬性,我需要查找所有對象在哪裏targetId匹配第一個列表中的對象的Id,兩個列表中的對象都有一系列其他不同的屬性基於另一個列表中的對象屬性的排序列表

第一個列表將定義匹配對象的順序 - 實際順序無關緊要,因爲兩個列表的排序都是一樣的,下面的例子顯示了我的意思,第二個列表按照TargetId排序,以匹配第一個列表中的Id命令:

firstList = [{name: a, id:1}, {name: b, id:2}, {name: c, id:3}] 
secondList = [{name: d, targetId: 2}, {name:e, targetId: 3}, {name: f, targetId: 1}] 

sortedList = [{name: f, targetId: 1}, {name:d, targetId: 2}, {name: e, targetId: 3}] 

我以爲像下面的東西可以工作,但我得到一個序列不包含元素錯誤,即使我知道每個對象在另一個列表中有一個匹配。已嘗試排序,沒有成功。

List<object> firstList; // objects have an Id 
List<object> secondList; // objects have a TargetId property 
List<object> sortedList = new List<object>(); // the new list to store matched objects 

foreach (object o in firstList) { 
    sortedList.Add(secondList.Where(x => x.TargetId == o.Id).First()); // should only return one object, but First() just in case 
} 

foreach (object o in sortedList) { 
    //do something with the ordered list 
} 

回答

2

我建議將第一個循環轉換爲Linq語句。你有它設置方式看起來容易修改的封閉問題:

var sortedList = firstList.Select(o => 
    secondList.First(x => x.TargetId == o.Id)) 
.ToList(); 

我不知道這裏的「序列不包含任何元素」的錯誤可以從其他現身比First() - 你肯定有firstList中沒有匹配secondList的元素?以下將是一個不錯的仔細檢查(FirstOrDefault而不是First,與空校驗):

var sortedList = firstList.Select(o => 
    secondList.FirstOrDefault(x => x.TargetId == o.Id)) 
.Where(item => item != null) 
.ToList(); 
+0

感謝McGarnagle - 將會給它一展身手。由於我設置了測試列表以確保每個對象都匹配,所以認爲這個錯誤看起來很奇怪。 – Nathan

相關問題