2010-06-09 2 views
1

Я пытаюсь использовать один атрибут для использования в качестве ключа, а другой для использования в качестве значения. Если я использую (XDoc является объект XDocument в примере):Взятие 2 атрибутов из XElement для создания словаря LINQ

Dictionary<string, XElement> test = xDoc.Descendants() 
    .Where<XElement>(t => t.Name == "someelement") 
    .ToDictionary<XElement, string>(t => t.Attribute("myattr").Value.ToString()); 

Я получаю словарь с myattr значения в качестве ключа (который является то, что я хочу), но весь объект XElement в качестве значения.

Что я хочу сделать, это выбрать второй атрибут для установки в качестве свойства значения для каждого словаря, но не может показаться, что это не так.

Можно ли все это сделать в 1 заявлении Linq? Любопытство поймало меня!

Cheers!

ответ

4

Да, вы можете перейти в другое выражение, чтобы выбрать значение, которое вы хотите:

Dictionary<string,string> test = xDoc.Descendants() 
    .Where(t => t.Name == "someelement") 
    .ToDictionary(
     t => t.Attribute("myattr").Value.ToString(), 
     t => t.Attribute("otherAttribute").Value.ToString()); 
+0

Отлично работает! Спасибо за ответ, но почему кастинг меняет ситуацию? Если у меня есть кастинг во втором выражении, которое он ищет, это компаратор. – AndrewC

+0

@ AndyC, что вы пытаетесь сделать? .ToDictionary имеет несколько разных перегрузок, один из которых берет компаратор. – driis

+0

в моем исходном коде у меня было , взяв это, он заработал. Просто любопытно, почему это так. – AndrewC

1

Отливка в вашем .ToDictionary() вызова переворачивает параметры вокруг от вашего определения объекта.

Все, что вам нужно сделать, это сбросить его и добавить идентификатор, и он должен работать.

Dictionary<string, XElement> test = xDoc.Descendants() 
      .Where<XElement>(t => t.Name == "someelement") 
      .ToDictionary(t => t.Attribute("myattr").Value.ToString(), t => t); 
+0

Второй параметр в вашем .ToDictionary() является превосходным. t => t неявно в одной переменной перегрузки, которая принимает только keySelector. –

Смежные вопросы