2013-10-16 181 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

相关问题