2

私には2つのリストがあり、1つにはリストがあり、もう1つには次のようなobject Aリストがあります。objects B

ObjectA
{
    Int64 idObjectA;
    String name;
    ....
}

ObjectB
{
    Int64 idObjectB;
    Int64 idObjectA;
    String name;
    ....
}

私は2つのリストを持っています。1つはと、もう1つはとObject AですObject B。のいずれかである、list Cのみを持つ新しいを作成したいと思います。objects BIDObjectAIDlist A

SQLでは、次のような行になります。

select * from B where IDObjectA IN(1,2,3,4...);

私の場合、の値のリストは、プロパティを持つのIN clauseリストです。ObjectAidObjectA

4

4 に答える 4

5

Joinlinqメソッドを使用して、結合listBlistA、それらを使用してこれを実現しidObjectA、を選択できますitemB

var result = (from itemB in listB
              join itemA in listA on itemB.idObjectA equals itemA.idObjectA
              select itemB).ToList();

この方法には線形の複雑さがあります(O(n))。Where(... => ....Contains())またはdoubleを使用foreachすると、2次の複雑さがあります(O(n^2))。

于 2013-02-03T12:53:39.443 に答える
1

linqではありませんが、必要なことを実行します。

List<ObjectB> C = new List<ObjectB>();
foreach (n in B)
{
    foreach (c in A)
    {
        if (n.idObjectA == c.idObjectA)
        {
            C.Add(n)
            break;
        }
    }
}

または、より高いパフォーマンスが必要な場合は、forを使用し、それよりも高い場合は、CédricBignonのソリューションを使用します。

于 2013-02-03T12:56:57.523 に答える
1

これは、結合とは少し異なる方法です。

List<ObjectA> listA = ..
List<ObjectB> listB = ..
int[] listAIds = listA.Select(a => a.idObjectA).ToList();
               //^^ this projects the list of objects into a list of ints

//It reads like this...

//get items in listB WHERE..
listB.Where(b => listAIds.Contains(b.idObjectA)).ToList();
//b.idObjectA is in listA, OR where listA contains b.idObjectA
于 2013-02-03T12:57:34.370 に答える
1

結合の場合も含まない場合も同じです。

var listC = listB.Join(listA, b => b.ObjectAId, a => a.Id, (b, a) => b).ToList();
于 2013-02-03T13:05:41.087 に答える