C# 使用c在linq中展平列表

C# 使用c在linq中展平列表,c#,linq,list,C#,Linq,List,我使用linq创建了一个IO_方程列表。IO_方程由单个输出_点和输入_点列表组成。输入点和输出点具有公共的x、y和z坐标,但它们包含其他不公共的字段。我只想将IO_方程列表展平为匿名类型或特定点类型x、y和z,这样我就可以看到列表中每个IO_方程的输出和所有输入 我能够使用linq列出所有的输出点,使用下面的代码。列表41是IO_方程的列表 var flat = (from d2 in list41 select (new BINARY_IO()

我使用linq创建了一个IO_方程列表。IO_方程由单个输出_点和输入_点列表组成。输入点和输出点具有公共的x、y和z坐标,但它们包含其他不公共的字段。我只想将IO_方程列表展平为匿名类型或特定点类型x、y和z,这样我就可以看到列表中每个IO_方程的输出和所有输入

我能够使用linq列出所有的输出点,使用下面的代码。列表41是IO_方程的列表

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列出所有的输入点,使用下面的代码。 列表41是IO_方程的列表。propIOPointList是我的输入点列表

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();
我可以通过将数据格式化为一个输出,然后是输入,然后是下一个输出,然后是输入等方式分别获取信息

我有一种感觉,这真的很简单,我就是不能让它工作


谢谢

要在LINQ中展平列表,请使用。选择Many

许多类似的问题,例如:

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

请注意,我使用Enumerable.Repeatv,1来获取单例,还有其他方法


此外,您还可以内联调用SelectMany,但此时您可能需要切换查询语法,只需使用手动调用从/Select中选择第二个选项。

此答案非常不完整。你能告诉他如何用使用SelectMany的查询语法重写他的示例吗?我在输入点列表中尝试了SelectMany,效果很好,但最终列表中没有包含我的输出点。这感觉就像我想要选择输出点并连接输入点列表,以创建我正在寻找的最终列表。它是否类似于:list41.SelectManyeq=>eq.INPUT\u POINTs,eq,inputs=>new{OUTPUT=eq.OUTPUT\u POINT,INPUTS=INPUTS.tolist您可以使用Select:list41.SelectManyeq=>eq.INPUT\u POINTs,eq,INPUTS=>new{eq=eq,INPUT=INPUTS.Selectt=>new进一步修改它{OutputPoint=t.OUTPUT,InputX=t.INPUT.X,InputY=t.INPUT.Y,InputZ=t.INPUT.Z.ToList;我们能看到涉及的每个类的声明吗请输入IO_方程,输入_点,输出_点,其他?这样我可以改进我的答案,而不是一段解释你的模型,模型的代码会更有用。这工作得很好。列出single输出,然后连接输入列表,这正是我想要做的。
var flattenedList = list1.SelectMany(i => i.PropertyThatIsAList)
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();