我有两个存储两种不同类型的通用列表:
class A {
public int id;
//...
}
class B {
public int id;
//...
}
他们共享一个类似的属性,id。现在,一个列表具有对象及其id的特定顺序,第二个列表具有完全不同的id顺序:
List<A> listA; // the ids of objects inside go as follows: 4, 5, 1
List<B> listB; // the ids of objects inside go as follows: 1, 4, 5
我想对listB进行排序,以便listB[0].id==listA[0].id
,listB[1].id==listA[1].id
等。考虑使用Join
,但不知道放在OrderBy
中的内容。
答案 0 :(得分:1)
只需逐项遍历List<A>
,在B
的源实例中找到相应的List<B>
项,并将其存储到List<B>
的另一个目标实例中。你完成了。
List<B> destinationListB = new List<B>();
foreach (A in listA)
{
B b = listB.FirstOrDefault(item => item.id = A.id);
if (b != nul) destinationListB.Add(b);
}
免责声明:可能会有更节省时间的解决方案。
答案 1 :(得分:1)
您可以临时创建包含所需索引的匿名对象,然后按此索引排序:
var result = listB.Select((b, index) =>
new {Index = listA.FindIndex(a => a.id == b.id),
B = b})
.OrderBy(b => b.Index)
.Select(b => b.B).ToList();
因此,第一个Select
会创建一系列对象,其中包含Index
中匹配元素的listA
。
然后,该序列按该索引排序,最终Select
以正确的顺序从listB
中提供实例。
答案 2 :(得分:0)
List.FindIndex()是你的朋友:
var orderedB = listB.OrderBy(b => listA.FindIndex(a => a.id == b.id));