如何迭代Linq查询中的XML元素结果集

如何迭代Linq查询中的XML元素结果集,xml,linq,Xml,Linq,这是我对代码的想法(Linq查询能否直接填充dictionary对象?) XElement doc=XElement.Load(data.xml); string Element=“KeyNode”; string SearchString=“自治领”; 字典查询数据=新字典(); var query=来自文档子体(元素)中的子级 其中SearchString==child.Value 选择pn.Parent.Elements(); foreach(查询中的元素x) { Add(x.Name.T

这是我对代码的想法(Linq查询能否直接填充dictionary对象?)

XElement doc=XElement.Load(data.xml);
string Element=“KeyNode”;
string SearchString=“自治领”;
字典查询数据=新字典();
var query=来自文档子体(元素)中的子级
其中SearchString==child.Value
选择pn.Parent.Elements();
foreach(查询中的元素x)
{
Add(x.Name.ToString(),x.Value);
}

我会这样做来创建字典:

var queryData = query.ToDictionary(x => x.Name.ToString(), x => x.Value);
然而,只有当您知道您的XML没有任何重复的名称时,这才是安全的。如果它可能有重复的名称,您可能希望在查询中获得一个不同的列表,或者作为
ToDictionary()
的替代方法进行调查

此外,代码将标记名存储为字典键。如果这是你需要的,那太好了。但是,如果您确实需要标记属性的值或类似的值,那么您需要更改代码

更新

我想我明白问题所在了。您从未实际说明迭代结果的困难,但我认为可能是这样的:

Elements()
方法返回一个
IEnumerable
。这意味着
查询
变量的类型实际上是
IEnumerable
。如果您想将其展平为包含所有元素的单个列表,请按照以下方法操作:

var flattened = query.SelectMany(x => x);

感谢字典部分,但要尝试它,我需要迭代初始结果。就是这样!叛军在那里,我相信天行者也在那里!非常感谢,压扁成功了。如果您能解释为什么我的结果集生成嵌套的ienumerables,请假设您的select语句是
select child.Name.ToString()
。您将得到一个
IEnumerable
。您的real select语句返回一系列元素(所有父元素的子元素)。由于查询的最终结果是对select语句的每次调用所产生的一系列值,并且每个select语句返回一系列元素,因此最终将得到一系列元素。
var flattened = query.SelectMany(x => x);