c# - 连接具有一对多关系的两个列表

标签 c#

我有两个这样的类(class)。一个有另一个类的列表,并通过 key1 链接。

public class Alpha
{
    public key1 { get; set; }
    public List<Bravo> { //getter and setter }
}

public class Bravo
{
    public key1 { get; set; }
    public someProp { get; set; }
}

我有一种方法可以获取两个 Alpha 和 Bravo 列表,我需要将它们加入到一个 Alpha 列表中。每个 Alpha 与 Bravo 都有一对多的关系,但现在我有很多 Alpha。我知道我可以遍历两个列表,但是有更快的方法吗?

public List<Alpha> Join (List<Alpha> alphaList, List<Bravo> bravoList)
{
    //match each Bravo with it's corresponding Alpha
}

示例:

alphaList = { 
    item1 { key1 = 1, bravoList { } }
    item2 { key1 = 2, bravoList { } }
    item3 { key1 = 3, bravoList { } }
}

bravoList = {
    itemA { key1 = 1, someProp }
    itemB { key1 = 2, someProp }
    itemC { key1 = 2, someProp }
    itemD { key1 = 3, someProp }
    itemE { key1 = 3, someProp }
}

finalList = {
    item1 { key1 = 1, bravoList { itemA } }
    item2 { key1 = 2, bravoList { itemB, itemC } }
    item3 { key1 = 3, bravoList { itemD, itemE } }
}

最佳答案

您可以使用Enumerable.Join :

public List<Alpha> Join(List<Alpha> alphaList, List<Bravo> bravoList)
{
    return alphaList.Join(bravoList, a => a.key1, b => b.key1, (a,b) => a)
                    .ToList();
}

这将返回所有 Alpha 的列表,其中 key1 也在 Bravos 列表中。

更新:

public List<Alpha> Join(List<Alpha> alphaList, List<Bravo> bravoList)
{
    List<Alpha> finalList = alphaList
        .Select(a => new Alpha { 
             key1 = a.key1, 
             bravoList =  bravoList.Where(b => b.key1 == a.key1).ToList()
         }).ToList();
    return finalList;
}

关于c# - 连接具有一对多关系的两个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799681/

相关文章:

c# - 无法启用约束。使用数据表适配器时

c# - 长任务期间的进度条进度

c# - 如何动态地在 xamarin 表单中的标签上创建点击事件

c# - 无法使用 C# 将从 PayPal 收到的日期转换为 UTC 日期

c# - Windows 应用商店应用程序 - 拖动项目时 ListView 增加高度

c# - 在 C# 中使用 Webclient 时如何忽略 SSL 检查

c# - 如何在 C# 中将类型转换为 TEnum

c# - 在构造函数之前设置字段或属性值

c# - 使用 RhinoMocks 测试私有(private)方法

c# - 跳过单一方法的所有 Umbraco 魔法