2016-05-30 160 views
1

我有两种不同类型的两个通用列出存储:基于另一个排序列表?

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

+0

你为什么不创建一个类'Mother'一个ID,让你的两个类继承它,然后排序呢? –

+2

'listB [1] .id == listA [2] .id'不应该是'listB [1] .id == listA [1] .id'? – Nasreddine

+0

@Nasreddine是的,修正的,thx – user1255410

回答

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创建一个包含匹配的元素的IndexlistA对象序列。
然后按该索引对该序列进行排序,最后Select以正确的顺序给出listB的实例。

1

刚刚经历List<A>逐项进行迭代,找到的List<B>源实例对应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); 
} 

免责声明:可能有更省时的解决方案。