2016-05-30 17 views
1

私が記憶されている2つの異なるタイプの2つの一般的なリストを持っている:リストを別のものに基づいてソートしますか?

class A { 
    public int id; 
    //... 
} 
class B { 
    public int id; 
    //... 
} 

彼らは同様の性質、IDを共有しています。今つのリストは、オブジェクトとそのIDの特定の順序を有し、第2の1のIDの全く異なる順序があります。listB[0].id==listA[0].idlistB[1].id==listA[1].idなどがJoinを使用して考えたよう

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のをソートしたいのですが、ありません何を入れるか考えてOrderBy

+0

は、なぜあなたは、あなたの2つのクラスが、それによって、その後の並べ替え、そこから継承させる、IDと 'Mother'クラスを作成しませんか? –

+2

'listB [1] .id == listA [2] .id'それは' listB [1] .id == listA [1] .id'であってはなりませんか? – Nasreddine

+0

@Nasreddine yes、fixed、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(); 

だから最初 SelectlistAに一致する要素の Indexを含むオブジェクトのシーケンスを作成します。
このシーケンスは、そのインデックスによって順序付けされ、最後の 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); 
} 

免責事項:より効率的な解決策があるかもしれません。

関連する問題