使用c#在linq中展平列表

时间:2015-04-21 19:57:20

标签: c# linq list

我使用linq创建IO_EQUATIONS列表。 IO_EQUATION由单个OUTPUT_POINT和一个INPUT_POINT列表组成。 INPUT_POINT和OUTPUT_POINT具有共同的x,y和z坐标,但它们包含不常见的其他字段。我想将IO_EQUATIONS列表展平为匿名类型或特定点类型(仅限x,y和z),以便我看到输出后跟列表中每个IO_EQUATION的所有输入。

我能够使用linq使用以下代码列出所有OUTPUT_POINTS。 list41是IO_EQUATIONS列表

var flat = (from d2 in list41
            select (new BINARY_IO()
              {
                 propX = d2.propOutputPoint.propX,
                 propY = d2.propOutputPoint.propY,
                 propZ = d2.propOutputPoint.propZ,
                 propDir = POINT_DIRECTION_Types.Output,
              })).ToList();

我能够使用linq使用以下代码列出所有INPUT_POINTS。 list41是IO_EQUATIONS的列表。 propIOPointList是我的INPUT_POINT列表

var flat = (from d2 in list41
            from d3 in d2.propIOPointList
            select (new BINARY_IO()
                 {
                    propX = d3.propX,
                    propY = d3.propY,
                    propZ = d3.propZ,
                    propDir = POINT_DIRECTION_Types.Input,
                 })).ToList();

我可以单独获取信息,我希望将数据格式化为输出,然后是输入,然后是下一个输出,后跟输入等。

我觉得这很简单,我无法让它发挥作用。

由于

2 个答案:

答案 0 :(得分:1)

要在LINQ中展平列表列表,请使用.SelectMany

var flattenedList = list1.SelectMany(i => i.PropertyThatIsAList)

许多类似的问题,例如: Flatten List in LINQ

答案 1 :(得分:1)

最简单的方法是按照您列出的顺序将list41中的每个项目转换为IEnumerable<BINARY_IO>,然后使用SelectMany展平生成的IEnumerable<IEnumerable<BINARY_IO>>

var flat =
    (from d2 in list41
     select
        Enumerable.Repeat(
            new BINARY_IO {
                propX = d2.propOutputPoint.propX,
                propY = d2.propOutputPoint.propY,
                propZ = d2.propOutputPoint.propZ,
                propDir = POINT_DIRECTION_Types.Output}, 1)
            .Concat(
                from d3 in d2.propIOPointList
                select new BINARY_IO {
                    propX = d3.propX,
                    propY = d3.propY,
                    propZ = d3.propZ,
                    propDir = POINT_DIRECTION_Types.Input}))
    .SelectMany(i => i)
    .ToList();

请注意,我使用Enumerable.Repeat(v, 1)来获取单身,还有其他方法。

此外,您可以内联对SelectMany的调用,但此时您可能希望切换到查询语法,只需使用Select手动调用第二个from / { {1}}。