加入两个具有一对多关系的列表

时间:2013-04-03 22:54:58

标签: c#

我有两个类似的。一个有另一个类的列表,并通过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列表中。每个阿尔法与布拉沃有一对多的关系,但现在我有很多阿尔法。我知道我可以遍历两个列表但是有更快的方法吗?

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 } }
}

3 个答案:

答案 0 :(得分:3)

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

这将返回Alphas的所有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; } 列表中。

<强>更新

{{1}}

答案 1 :(得分:2)

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

public class Alpha
{
    public int key1 { get; set; }

    public List<Bravo> list { get; set; }
}

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

    public string someProp { get; set; }
}

答案 2 :(得分:1)

根据您的评论,Bravo上的Alpha列表非常无关紧要,因为它不是由ORM以任何方式管理的。

如果你想加入,这是最简单的使用方式:

public IEnumerable<Tuple<Alpha, Bravo>> Join (IEnumerable<Alpha> alphaList, IEnumerable<Bravo> bravoList)
{
    return (from a in alphaList
            join b in bravoList on a.key1 equals b.key1
            select Tuple.Create(a, b))
           .ToList();
}

由于这是多对一的关系,这可能会更有用:

public Lookup<Alpha, Bravo> Join (IEnumerable<Alpha> alphaList, IEnumerable<Bravo> bravoList)
{
    return (from a in alphaList 
            join b in bravoList on a.key1 equal b.key1 into g
            select new { a, g })
           .ToLookup(x => x.a, x.g)
}

注意into条款;它允许您将连接的项目组合在一起。然后我将分组转换为Lookup以便于访问。

如果您 希望将列表保留在Alpha上,如果没有foreach - 循环或者构建您的大量工作,可能无法执行此操作拥有mini-ORM。