#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];
.