我有两个类似的。一个有另一个类的列表,并通过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 } }
}
答案 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。