0

我有一个基于 XML 模式的对象,并希望使用 LINQ 从中获取我感兴趣的数据:)

结构类似于以下示例:

SimulationStep [1..n]
   - EnvironmentStep [1]
       - Events [0..n]
           - ResultingStateChanges [0..n]
               - Objects [1]
                   - Object[0..n]

每个“对象”(该类链中的最后一个)都有一个属性 x、y 和 z,表示该对象在 3D 空间中的位置。还有一个 ID 用于识别每个对象。

现在我想为等于给定 ID 的对象的每个 SimulationStep 收集所有 (x,y,z) 三元组。

我这样试过:

for (int i = 0; i < stepCount; i++)
{
    var events = from c in log.SimulationStep[i].EnvironmentSimulatorStep.EnvSimInputEvent
                        from d in c.ResultingStateChanges
                        from e in d.Agents.Agent
                       where e.id == id
                       select new { c.occurrenceTime, o = new Vector3((float)e.x, (float)e.y, (float)e.z) }
}

但是我得到的只是SimulationStep 0的结果(x,y,z)。但我想要一个包含每个步骤中位置的列表。这样:例如....

SimStep[0] - (0,0,0)
SimStep[1] - (5,0,0)
SimStep[2] - (10, 7, 0)
4

2 回答 2

1

希望我有你的问题。

尝试这个:

//代码

var events = from s in log.SimulationStep
                        from c in s.EnvironmentSimulatorStep.EnvSimInputEvent
                        from d in c.ResultingStateChanges
                        from e in d.Agents.Agent
                        where e.id == id
                        select new { 
                                     c.occurrenceTime, 
                                     o = new Vector3((float)e.x, 
                                     (float)e.y, 
                                     (float)e.z) 
                                    }
于 2013-04-24T09:09:24.430 回答
0

在没有实际看到代码的情况下,我无法判断 log.SimulationStep 是什么类型。如果确实是 Access Closure Modified 问题,解决这个问题的方法就是将 for 循环滚动到我们的 LinQ 语句中(或者一直使用 for 循环)。

var events = from i in Enumerable.Range(0, stepCount)
             let simulationStep = log.SimulationStep[i]
             from c in simulationStep.EnvironmentSimulatorStep.EnvSimInputEvent
             from d in c.ResultingStateChanges
             from e in d.Agents.Agent
             where e.id == id
             select new { 
                          c.occurrenceTime, 
                          o = new Vector3((float)e.x, 
                          (float)e.y, 
                          (float)e.z) 
                        }
于 2013-04-24T09:16:47.737 回答