2011-11-16 80 views
4

我有一個的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> 

欲獲得(A,B),其中所述密鑰被綁定到<param1>字典和值是相關成分的項目的列表:

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> 

我試着用這樣的:

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

但我仍然得到4個元素,鍵值合作選擇重複的鍵,而不是我想要的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( 「參數1」)';屬性相同的作品。 – user7116