我的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元素字典。有什么帮助吗?
答案 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());