基于另一个List中的对象属性对列表进行排序

时间:2013-10-16 23:00:53

标签: c# asp.net-mvc linq razor

我需要找到两个列表共有的对象,基于每个列表中对象的不同属性(一个列表中的对象具有targetId属性,我需要找到targetId与其中对象的Id匹配的所有对象第一个列表。两个列表中的对象都有一系列其他不同的属性。

第一个列表将定义匹配对象的顺序 - 实际顺序无关紧要,只要两个列表的顺序相同即可。下面的示例[pseudocode]显示我的意思,其中第二个列表按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
}

1 个答案:

答案 0 :(得分:3)

我建议将第一个循环转换为Linq语句。你设置它的方式看起来容易受到修改后的闭包问题的影响:

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

我不确定“序列不包含任何元素”的错误可能来自First()之外的其他错误 - 您确定firstList中没有secondList中没有匹配的元素FirstOrDefault 1}?以下是一个很好的复核(First而不是var sortedList = firstList.Select(o => secondList.FirstOrDefault(x => x.TargetId == o.Id)) .Where(item => item != null) .ToList(); ,并进行空检查:

{{1}}