我使用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();
我可以单独获取信息,我希望将数据格式化为输出,然后是输入,然后是下一个输出,后跟输入等。
我觉得这很简单,我无法让它发挥作用。
由于
答案 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}}。