C# LINQ到对象
我有一个基于XML模式的对象,希望使用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
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)
}