如何更改嵌套列表的循环linq

时间:2018-01-04 22:45:30

标签: c# linq

我遇到过我有三个嵌套循环并希望通过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,
   });
  }
 }
}

有可能吗?谢谢你的建议

3 个答案:

答案 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级或者这实际上应该是一个递归问题,它确实提出了问题。