LinQ Group通过具有相同属性的嵌套元素

时间:2013-12-05 10:55:27

标签: c# linq lambda

我有以下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
);

当我调试我的东西时,变量不包含元素。

有什么建议吗?

提前致谢。

3 个答案:

答案 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();

结果:

enter image description here

答案 2 :(得分:1)

我认为你所追求的更像是:

 var something = MyElements.GroupBy
        (
           x => x.Elements("MT")
           .First
           (
             type => type.Attribute("N").Value == "Section"
           )
           .Attribute("V").Value
           ,
           x=>x
        );

(虽然不需要最后x=>x - 暗示。)

实例:http://rextester.com/MDAO1198