2011-11-16 4 views
4

는 I가 XElement를 이렇게 구성 가지고그룹화 XElement를 항목에 LINQ

<items> 
    <item> 
     <param1>A</param1> 
     <param2>123</param2> 
    </item> 
    <item> 
     <param1>B</param1> 
     <param2>456</param2> 
    </item> 
    <item> 
     <param1>A</param1> 
     <param2>789</param2> 
    </item> 
    <item> 
     <param1>B</param1> 
     <param2>101112</param2> 
    </item> 
</items> 

내가 키 <param1>에 결합되어 사전 (A, B)과의 값을 가져올는 상관 관계 아이템 목록이다 : 키 - 값 공동

var grouped = xItems.Descendants("item").GroupBy(r => r.Element("param1")) 
    .ToDictionary(g => g.Key, g => g.ToList()); 

하지만 난 여전히 4 개 요소를 얻을 :

A -> <item><param1>A</param1><param2>123</param2></item> 
    <item><param1>A</param1><param2>789</param2></item> 
B -> <item><param1>B</param1><param2>456</param2></item> 
    <item><param1>B</param1><param2>101112</param2></item> 

나는이 함께 노력 중복 된 키를 사용하는 llection, 그리고 필자가 원했던 2 엘리먼트 사전은 아닙니다. 어떤 도움이 필요합니까?

답변

3

요소 자체가 아닌 각 요소의 속성으로 그룹화해야합니다 (예 : .Value). 이는 값이 같더라도 실제로 요소가 같지 않으므로 요소가 항상 달라지기 때문입니다. 따라서 내용에 관계없이 모든 param1 요소에 대한 그룹이 생성됩니다.

대신을 시도해보십시오

using System; 
using System.Linq; 
using System.Xml.Linq; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     const string docAsText = "..."; 
     var doc = XDocument.Parse(docAsText); 
     var result = doc.Descendants("item") 
      .GroupBy(r => r.Element("param1").Value) // Important: using .Value 
      .ToDictionary(g => g.Key, g => g.ToList()) 
      ; 

     foreach (var r in result) 
     { 
      Console.WriteLine(r.Key); 
      Console.WriteLine(string.Join(",", r.Value)); 
     } 
    } 
} 

이 출력합니다 :

A 
<item> 
    <param1>A</param1> 
    <param2>123</param2> 
</item>,<item> 
    <param1>A</param1> 
    <param2>789</param2> 
</item> 
B 
<item> 
    <param1>B</param1> 
    <param2>456</param2> 
</item>,<item> 
    <param1>B</param1> 
    <param2>101112</param2> 
</item> 
2

좋아, 찾았습니다. 나는 그 요소의 VALUE에 의해 그룹화하는 것을 잊었다. 다음 작동 방식 :

var grouped = xItems.Descendants("item").GroupBy(r => r.Element("param1").Value) 
    .ToDictionary(g => g.Key, g => g.ToList()); 
+0

또 다른 옵션 :'(문자열) r.Element ("PARAM1") '; 속성에 대해서도 똑같이 작동합니다. – user7116