簡體   English   中英

LinQ GroupBy對具有相同屬性的嵌套元素

[英]LinQ GroupBy on nested element with same attributes

我有以下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查詢來按節將所有結果分組,使用節值作為鍵,將整個元素用作元素選擇器:

//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
);

當我調試我的東西變量不包含元素。

有什么建議嗎?

提前致謝。

約瑟

鍵選擇最終以IEnumerable<string>作為結果,這肯定是錯誤的。 它應該給您留下一個簡單的string ,可以用

x => x.Elements("MT").Single(t => t.Attribute("N").Value == "Section")
                     .Attribute("V").Value

您也不需要身份投影x => x ,因為這是隱含的。

最后,如果MyElements本身不是空的,則給出的代碼將永遠不會導致something為空。

如果我正確理解您的要求,它將是:

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

結果:

在此處輸入圖片說明

我認為您追求的是:

 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM