2

我有两个列表,一个有object A另一个列表objects B,如下所示:

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

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

我有两个列表,一个带有Object A,另一个带有Object B。我想创建一个新的list C只有.objects BIDObjectAIDlist A

在 SQL 中,它会是这样的一行:

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

在我的例子中, 的值列表IN clause是 的列表ObjectA,它具有属性idObjectA

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())or doubleforeach具有二次复杂度 ( 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édric Bignon 的解决方案更高。

于 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

与 Join 和没有 Contains 相同:

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