列表<t>在id匹配时添加到T.

时间:2015-05-11 08:01:34

标签: c# linq

我有2个不同对象的列表:

public class A {
    string Id;
    string Name;
    List<B> listofB;
}

public class B {
    string Id;
    string Test;
}

B中的ID与A

中的ID相同

现在我有2个列表

var listA = new List<A>();
var listB = new List<B>();

如何通过linq将Id匹配的每个B对象添加到A列表?

现在我做了:

foreach(var a in listA){
   a.listofB = listB.FindAll(i => i.Id == a.Id);
}

但我认为有更好的方法可以做到这一点

(现在总是返回null,仍在试图找出原因)

3 个答案:

答案 0 :(得分:4)

  但我认为有更好的方法可以做到这一点 如果这对你有用,为什么你认为有更好的东西?它具有可读性和高效性。 但是,您可以使用Enumerable.Join + GroupBy: var idGrps =来自listA中的a              在listB中加入b              在a.Id等于b.Id进入bGroup              选择新的{a,bGroup}; foreach(在idGrps中的var grp) {     grp.a.listofB = grp.bGroup.ToList(); } 但即使如果列表很大,Join更有效,它也不具有可读性。也许最好从一开始就从A构造函数初始化列表,而不是维护两个列表。

答案 1 :(得分:1)

使用GroupJoin

void Main()
{
    var alist = new List<A>();
    var blist = new List<B>();

    result = alist.GroupJoin(
        blist,
        a=>a.Id,    //Pick group key from A
        b=>b.Id,    //Pick group key from B
        (singleA,manyB)=>
            new{TheA=singleA,AllTheBs=manyB.ToList()}); //Create a resulting object.
}

答案 2 :(得分:0)

您可以使用GroupBy子句:

var theBsById = listB.GroupBy(b => b.Id);

然后:

foreach(IGrouping<int, B> grouping in theBsById)
{
    A theA = listA.Where(a => a.Id == grouping.Key).FirstOrDefault();
    if (theA != null)
    {
        theA.listofB = grouping.ToList();
    }
}

(这只会更新在listB中有Ids的As中的listofBs)

或:

foreach(var a in listA)
{
    a.listofB = theBsById
      .Where(grouping => grouping.Key == a.Id)
      .SelectMany(grouping => grouping)
      .ToList();
}

(这会更新所有As的listofB,这也是上面的代码所做的。)