Каким будет запрос для этого XML-файла?

#c# #xml #linq #linq-to-xml

#c# #xml #linq #linq-to-xml

Вопрос:

Мне трудно создать запрос. Это файл:

 <Root>
<Summary>
    <Objective ID="1">
        <Exam Result="70" />
        <Exam Result="90" />
    </Objective>
    <Objective ID="2">
        <Exam Result="100" />
        <Exam Result="90" />
    </Objective>
</Summary>
</Root>
  

Мне нужно получить значения в List<Список< двойной>> . Первый список предназначен для целей, а последний предназначен для хранения каждого результата.

Есть сомнения, пожалуйста, дайте мне знать

Ответ №1:

Я подозреваю, что вы хотите:

 var results = doc.Descendants("Objective")
                 .Select(x => x.Elements("Exam")
                               .Select(exam => (double) exam.Attribute("Result"))
                               .ToList())
                 .ToList();
  

Или, если идентификатор объекта важен, вы можете рассмотреть Dictionary<int, List<double>> :

 var results = doc.Descendants("Objective")
                 .ToDictionary(x => (int) x.Attribute("ID"),
                               x => x.Elements("Exam")
                                     .Select(y => (double) y.Attribute("Result"))
                                     .ToList());
  

Или Lookup<int, double> :

 var results = doc.Descendants("Exam")
                 .ToLookup(x => (int) x.Parent.Attribute("ID"),
                           x => x.Select(y => (double) y.Attribute("Result"));
  

Комментарии:

1. Разве не должно быть ‘,’ вместо ‘.’ в конце вашего . Строка ToDictionary?

2. @PhilippSchmid: Да — просто опечатка 🙂

3. @PhilippSchmid: В будущем продолжайте — просто оставьте комментарий, чтобы я заметил и мог проверить 🙂

4. @Jon Это здорово. Это последний вопрос. Как я могу получить оценки результата? Я имею в виду, иметь список (List ), где содержатся значения X objective . Например, если X = 1, он должен получить список результатов из objective 1. Это будет содержать, 70 и 80.

5. @OscarFimbres: С версией словаря вы бы просто использовали List<double> foo = results[1]; .