2

我有两个这样的课程。一个有另一个类的列表,并由 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 } }
}
4

3 回答 3

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;
}
于 2013-04-03T23:00:40.777 回答
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; }
}
于 2013-04-03T23:00:17.917 回答
1

根据您的评论,Bravo's on列表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以便于访问。

如果您确实想保留列表,那么如果没有-loop 或大量构建您自己的 mini-ORM 的工作Alpha,可能无法做到这一点。foreach

于 2013-04-03T23:00:25.263 回答