2010-06-09 3 views
1

하나의 속성을 키로 사용하고 다른 속성을 값으로 사용하려고합니다.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를 개체 : 내가 사용하는 경우 (xDoc이 예에서하여 XDocument 개체입니다).

내가 원하는 것은 두 번째 속성을 선택하여 각 사전 항목의 값 속성으로 설정하는 것이지만이를 파악할 수는 없습니다.

1 Linq 선언문에서이 모든 작업을 수행 할 수 있습니까? 호기심이 나를 붙 잡았다!

건배!

답변

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() 호출의 캐스팅은 개체 정의에서 주변의 매개 변수를 뒤집습니다.

당신이해야 할 일은 그것을 떨어 뜨리고 ID 선택을 추가하면 효과가 있습니다.

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를 취하는 단일 매개 변수 오버로딩에 함축적입니다. –

관련 문제