分组XElement项目(Linq)

4

我有一个类似于这样结构的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个回答

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

好的,找到了。我忘记按元素的进行分组了。以下是有效的:

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

另一种选择是:(string)r.Element("param1");同样适用于属性。 - user7116

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接