分组XElement项目(Linq)

时间:2011-11-16 08:28:37

标签: .net linq group-by

我的XElement结构如下:

<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),值是相关项的列表:

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元素字典。有什么帮助吗?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:2)

好的,找到了。我忘了按元素的 VALUE 进行分组。以下作品:

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