我有以下xml输出:
<R N="1">
<MT N="Section" V="Section-1" />
<MT N="Person" V="John" />
</R>
<R N="2">
<MT N="Section" V="Section-1" />
<MT N="Person" V="Peter" />
</R>
<R N="3">
<MT N="Section" V="Section-2" />
<MT N="Person" V="Joseph" />
</R>
... ...
<R N="N">
<MT N="Section" V="Section-J" />
<MT N="Person" V="PersonX" />
</R>
我尝试编写一个LinQ查询,按部分对所有结果进行分组,使用section值作为Key,将整个元素作为元素选择器:
//MyElements its an IEnumerable<XElement>
var something = MyElements.GroupBy
(
x => x.Elements("MT")
.Where
(
type => type.Attribute("N").Value == "Section"
)
.Select
(
type => type.Attribute("V").Value
)
,
x=>x
);
当我调试我的东西时,变量不包含元素。
有什么建议吗?
提前致谢。
何
答案 0 :(得分:1)
键选择结果以IEnumerable<string>
结束,这绝对是错误的。它应该给你一个简单的string
,可用
x => x.Elements("MT").Single(t => t.Attribute("N").Value == "Section")
.Attribute("V").Value
您也不需要隐含身份投影x => x
。
最后,如果something
本身非空,则给出的代码永远不会导致MyElements
为空可枚举。
答案 1 :(得分:1)
如果我理解你的要求,那将是:
var res = doc.Descendants("MT")
.Where(x => x.Attribute("N").Value == "Section")
.GroupBy(x => x.Attribute("V").Value,
(k, v) => new { Key = k, List = v.Select(x => x.Parent).ToList() })
.ToList();
结果:
答案 2 :(得分:1)
我认为你所追求的更像是:
var something = MyElements.GroupBy
(
x => x.Elements("MT")
.First
(
type => type.Attribute("N").Value == "Section"
)
.Attribute("V").Value
,
x=>x
);
(虽然不需要最后x=>x
- 暗示。)