我遇到过我有三个嵌套循环并希望通过linq更改它们的情况。 实施例
foreach(var level1 in listL1.elements) {
foreach(var level2 in level1.elements) {
foreach(var level3 in listL2.elements) {
commonLevelList.Add(new Level()
{
itemFromLevel1 = level1,
itemFromLevel2 = level2,
itemFromLevel3 = level3,
});
}
}
}
有可能吗?谢谢你的建议
答案 0 :(得分:2)
避免foreach
将失去少量性能并使代码更难以遵循,但基于您的(可能是错误的)问题,这是等效的LINQ:
var ans = listL1.elements.SelectMany(level1 => level1.elements.SelectMany(level2 => listL2.elements.Select(level3 => new Level() { itemFromLevel1 = level1, itemFromLevel2 = level2, itemFromLevel3 = level3}))).ToList();
答案 1 :(得分:0)
是的,你可以使用Linq:
var commonLevelList =
(from level1 in listL1.elements
from level2 in listL2.elements
from level3 in listL3.elements
select new Level()
{
itemFromLevel1 = level1,
itemFromLevel2 = level2,
itemFromLevel3 = level3,
}).ToList();
笛卡尔产品使用查询语法更容易“消化”(在引擎盖下,它使用SelectMany
,如NetMage的answer所示。)
答案 2 :(得分:0)
这看起来像你只是想交叉申请。如果是这种情况,它就像连接all一样简单,所以你可以用Join语句来做。
var commonLevelList = listL1.elements
.Join(listL2.elements, a => true, b => true, (a, b) => new Level()
{
itemFromLevel1 = a,
itemFromLevel2 = b,
})
.Join(listL3.elements, a => true, b => true, (a, b) => new Level()
{
itemFromLevel1 = a.itemFromLevel1,
itemFromLevel2 = a.itemFromLevel2,
itemFromLevel3 = b,
}).ToList();
重新阅读问题并看到它们是嵌套的,因此SelectMany是正确的而不是加入。我正在阅读它作为3个独立的名单。
如果您保证3级或者这实际上应该是一个递归问题,它确实提出了问题。