2013-04-24 5 views
0

У меня есть объект, построенный по схеме XML и хочу использовать LINQ, чтобы получить данные из него , который меня интересует :)LINQ к объектам

Структуры выглядеть как в следующем примере:

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

каждый «объект» (последний в этом классе цепи) имеет атрибут х, у и г, то есть положение этого объекта в 3D пространстве. Theres также идентификатор, который используется для идентификации каждого объекта.

Теперь я хочу собрать все (x, y, z) триплеты для каждого SimulationStep для объекта, который равен данному 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) } 
} 

, но все это я получаю с этим, есть результат (х, у, г) SimulationStep 0. Но я хочу список с позиций в каждом шаг. Таким образом: Например ....

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

почему бы не использовать XDocument это позволяет запрашивать данные XML –

+0

@VincentDagpin: Но я нахожусь в LINQ в настоящее время. – 2013-04-24 09:10:10

+0

@Sandy Существует [Linq2XML] (http://msdn.microsoft.com/en-us/library/bb387098.aspx) – Aron

ответ

1

Надежда я получил ваши Ques.

Попробуйте это:

// Код

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

Предполагая, что log.SimulationStep предоставляет IEnumerable , тогда это было бы так, как я мог бы пойти. – Aron

0

фактически не видя код я не могу сказать, что log.SimulationStep типа. Если это действительно проблема с закрытием доступа, способ исправить это просто перевернуть цикл for в нашу инструкцию LinQ (или просто использовать для циклов полностью).

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) 
         } 
Смежные вопросы