基于另一个排序列表?

时间:2016-05-30 15:17:25

标签: c# linq

我有两个存储两种不同类型的通用列表:

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].idlistB[1].id==listA[1].id等。考虑使用Join,但不知道放在OrderBy中的内容。

3 个答案:

答案 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));

工作示例:https://dotnetfiddle.net/CpLeFU