簡體   English   中英

c#where with list和linq

[英]c# where in with list and linq

我有兩個列表,一個列出了object A ,另一個列出了objects B ,如下所示:

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

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

我有兩個列表,一個是Object A ,另一個是Object B 我想創建一個只有objects B的新list CIDObjectAlist A任何ID

在SQL中,它將是以下內容:

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

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

您可以使用Join LINQ方法通過連接來實現這個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具有二次復雜度( O(n^2) )。

不是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的解決方案。

與連接相比,這種做法略有不同。

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

與加入和不包含相同:

var listC = listB.Join(listA, b => b.ObjectAId, a => a.Id, (b, a) => b).ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM