Как создать словарь <int, string> через LINQ to XML? - PullRequest
3 голосов
/ 13 мая 2010

У меня есть следующий XML:

<FootNotes>
  <Line id="10306" reference="*"></Line>
  <Line id="10308" reference="**"></Line>
  <Line id="10309" reference="***"></Line>
  <Line id="10310" reference="****"></Line>
  <Line id="10311" reference="+"></Line>
</FootNotes>

и у меня есть следующий код, где я должен получить Dictionary<int, string>() объект в

myObject.FootNotes 

так, чтобы каждая строка была парой ключ / значение

var doc = XElement.Parse(xmlString);

var myObject = new
  {
      FootNotes = (from fn in doc
                       .Elements("FootNotes")
                       .Elements("Line")
                       .ToDictionary
                       (
                       column => (int) column.Attribute("id"),
                       column => (string) column.Attribute("reference")
                       )
                  )
  };

Я не уверен, как получить это из XML в объект, хотя. Кто-нибудь может предложить решение?

1 Ответ

6 голосов
/ 13 мая 2010

Ваш код почти правильный. Попробуйте вместо этого небольшое отклонение:

FootNotes = (from fn in doc.Elements("FootNotes")
                           .Elements("Line")
             select fn).ToDictionary(
                 column => (int)column.Attribute("id"),
                 column => (string)column.Attribute("reference")
             )

Я не думаю, что длинный синтаксис from ... select действительно очень помогает здесь. Вместо этого я бы использовал этот немного более простой код:

Footnotes = doc.Descendants("Line").ToDictionary(
                e => (int)e.Attribute("id"),
                e => (string)e.Attribute("reference")
            )

Однако в вашем примере кода вы используете анонимный тип. Вам нужно использовать конкретный тип, если вы планируете вернуть этот объект вызывающей стороне.

var myObject = new SomeConcreteType
    {
        Footnotes = ....
    };
...