C# 列表<;T>;当id匹配时添加到T

C# 列表<;T>;当id匹配时添加到T,c#,linq,C#,Linq,我有两个不同对象的列表: public class A { string Id; string Name; List<B> listofB; } public class B { string Id; string Test; } 如何通过linq将Id与A列表匹配的每个B对象添加到A列表中 现在我做到了: foreach(var a in listA){ a.listofB = listB.FindAll(i => i.Id

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

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

public class B {
    string Id;
    string Test;
}
如何通过linq将Id与
A
列表匹配的每个
B
对象添加到
A
列表中

现在我做到了:

foreach(var a in listA){
   a.listofB = listB.FindAll(i => i.Id == a.Id);
}
但我认为有一个更好的方法


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

您可以使用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();
    }
}

(这将更新所有As的列表OFB,这也是您上面的代码所做的。)

您可以使用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();
    }
}
(这将更新所有As的列表OFB,这也是您上面的代码所做的。)

但我认为有一个更好的方法

如果这对你有用,为什么你认为还有更好的?它可读性强,可能效率高

但是,您可以使用
可枚举。加入
+
GroupBy

var idGrps = from a in listA
             join b in listB
             on a.Id equals b.Id into bGroup
             select new { a, bGroup };
foreach (var grp in idGrps)
{
    grp.a.listofB = grp.bGroup.ToList();
}
但是即使
Join
如果列表很大,它也不那么可读。也许最好从一开始就从
A
-构造函数初始化列表,而不是维护两个列表

但我认为有一个更好的方法

如果这对你有用,为什么你认为还有更好的?它可读性强,可能效率高

但是,您可以使用
可枚举。加入
+
GroupBy

var idGrps = from a in listA
             join b in listB
             on a.Id equals b.Id into bGroup
             select new { a, bGroup };
foreach (var grp in idGrps)
{
    grp.a.listofB = grp.bGroup.ToList();
}
但是即使
Join
如果列表很大,它也不那么可读。也许最好从一开始就从
A
-构造函数初始化列表,而不是维护两个列表。

使用

void Main()
{
var alist=新列表();
var blist=新列表();
结果=alist.GroupJoin(
布利斯特,
a=>a.Id,//从
b=>b.Id,//从b中选择组键
(单A,多B)=>
新建{TheA=singleA,AllTheBs=manyB.ToList()});//创建结果对象。
}
使用

void Main()
{
var alist=新列表();
var blist=新列表();
结果=alist.GroupJoin(
布利斯特,
a=>a.Id,//从
b=>b.Id,//从b中选择组键
(单A,多B)=>
新建{TheA=singleA,AllTheBs=manyB.ToList()});//创建结果对象。
}

您能否添加更多示例代码以便为我们测试?还有,什么是
findAll
?findAll是一个linq函数“但我认为有更好的方法来实现这一点”如果这对你有效,为什么你认为有更好的方法?它可读性强,可能效率高。他可能的意思是(这不是LINQ btw的一部分)FindAll应该返回一个空列表(如果没有找到元素):NOTNULL。我认为你应该提供更多的代码来帮助我们,我认为这更可能是一个延迟加载问题。你能添加更多的示例代码来为我们测试吗?还有,什么是
findAll
?findAll是一个linq函数“但我认为有更好的方法来实现这一点”如果这对你有效,为什么你认为有更好的方法?它可读性强,可能效率高。他可能的意思是(这不是LINQ btw的一部分)FindAll应该返回一个空列表(如果没有找到元素):NOTNULL。我认为您应该提供更多的代码,以便我们提供帮助,我认为这更可能是一个延迟加载问题。如果这真的比OP当前使用的方法更具可读性和效率,则是另一个问题……您将一个解决方案替换为一个使用2个嵌套迭代和一个GroupBy迭代的解决方案,并且流程中的可读性丢失。如果这确实比OP当前使用的方法更具可读性和效率,则是另一个问题……您将使用2个嵌套迭代的解决方案替换为使用2个嵌套迭代和一个GroupBy迭代的解决方案,并且流程中的可读性丢失。
Enumerable.Join
GroupJoin
是使用查询语法的有力指标;)<代码>可枚举。Join或
GroupJoin
是使用查询语法的有力指示器;)