C# LINQ到对象

C# LINQ到对象,c#,.net,linq,linq-to-objects,C#,.net,Linq,Linq To Objects,我有一个基于XML模式的对象,希望使用LINQ从中获取数据 我感兴趣的:) 该结构如以下示例所示: SimulationStep [1..n] - EnvironmentStep [1] - Events [0..n] - ResultingStateChanges [0..n] - Objects [1] - Object[0..n] 每个“对象”(该类链中的最后一个)都有一个属性x

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

该结构如以下示例所示:

SimulationStep [1..n]
   - EnvironmentStep [1]
       - Events [0..n]
           - ResultingStateChanges [0..n]
               - Objects [1]
                   - Object[0..n]
每个“对象”(该类链中的最后一个)都有一个属性x、y和z,表示该对象的位置 在三维空间中。还有一个用于标识每个对象的ID

现在,我想为对象的每个模拟步骤收集所有(x,y,z)三元组,它们等于给定的ID

我这样试过:

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) }
}
希望我收到你的支票

试试这个:

//代码

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) 
                                    }

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


为什么不使用XDocument呢?它允许您查询XMLdata@VincentDagpin:但我现在在LINQ中。@Sandy有一个@Aron:我在这方面没有太多经验。同样从一个非常高的层次来看,在没有实际看到您的代码的情况下,这看起来是一个问题。在将for循环与LinQ混合时,需要非常小心。假设log.SimulationStep公开IEnumerable,那么这就是我的方法。
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) 
                                    }
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) 
                        }