我有两个列表,一个有object A
的列表,另一个是objects B
的列表,如下所示:
ObjectA
{
Int64 idObjectA;
String name;
....
}
ObjectB
{
Int64 idObjectB;
Int64 idObjectA;
String name;
....
}
我有两份清单,一份是Object A
,另一份是Object B
。我想创建一个只有objects B
的新list C
,其中IDObjectA
是list A
中的任何ID
。
在SQL中,有一行是:
select * from B where IDObjectA IN(1,2,3,4...);
在我的例子中,IN clause
的值列表是ObjectA
的列表,它们具有属性idObjectA
。
您可以使用Join
linq方法,通过idObjectA
连接listB
和listA
,然后选择itemB
来实现这一点。
var result = (from itemB in listB
join itemA in listA on itemB.idObjectA equals itemA.idObjectA
select itemB).ToList();
该方法具有线性复杂度(O(n)
)。使用Where(... => ....Contains())
或双foreach
具有二次复杂度(O(n^2)
)。
与Join和不包含相同:
var listC = listB.Join(listA, b => b.ObjectAId, a => a.Id, (b, a) => b).ToList();
这与连接的方法略有不同。
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
不是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的解决方案。