2016-08-18 139 views
1

我有这个XML结构,我需要计算非空工作和家庭元素,groupby Country属性,然后orderby国家属性。C#Linq XML GroupBy OrderBy get count

Something like Dictionary>,但我用linq表达式失败。目前,该列表仅被过滤,groupby和orderby。缺少的部分是计数非空工和家庭元素。 是否有可能在查询中做到这一点或在查询列表后应该使用?

XMLFILE

<?xml version="1.0" encoding="utf-8"?> 
<Root> 
    <Region ID="NA"> 
     <Name>QWERTZ</Name> 
     <Country ID="1"> 
      <Facility Name="1"> 
       <Department Name="1"> 
        <Member Name="1"> 
         <Home>555-666</Home> 
         <Work>111-666</Work> 
        </Member> 
       </Department> 
      </Facility> 
     </Country>  
    </Region> 
     <Region ID="CHINA"> 
     <Name>ASDF</Name> 
     <Country ID="2"> 
      <Facility Name="2"> 
       <Department Name="2"> 
        <Member Name="2"> 
         <Home>111-222</Home> 
         <Work>111-222</Work> 
        </Member> 
       </Department> 
      </Facility> 
     </Country>  
    </Region> 
    <Region ID="EU"> 
     <Name>ASDF</Name> 
     <Country ID="3"> 
      <Facility Name="3"> 
       <Department Name="1"> 
        <Member Name="1"> 
         <Home>111-222</Home> 
         <Work></Work> 
        </Member> 
       </Department> 
      </Facility> 
     </Country>  
    </Region> 
</Root> 

方法

public static List<IGrouping<string,XElement>> getgrouped(string filename) 
{ 
    XDocument xml = XDocument.Load(filename); 

    return xml.Root 
     .Descendants("Country") 
     .GroupBy(x => (string)x.Attribute("ID").Value) 
     .OrderBy(g => g.Key) 
     .ToList(); 
} 

回答

2

对于每一个项目我与该国的id和非空的后代WorkHome元素数量的对象后代。然后我GroupBy和总结计数器。

xml.Root.Descendants("Country") 
    .Select(element => new 
    { 
     Id = (string) element.Attribute("ID").Value, 
     NonEmptyWork = element.Descendants("Work") 
           .Count(w => !string.IsNullOrEmpty(w.Value)), 
     NonEmptyHome = element.Descendants("Home") 
           .Count(w => !string.IsNullOrEmpty(w.Value)) 
    }) 
    .GroupBy(item => item.Id) 
    .Select(g => new 
    { 
     Id = g.Key, 
     NonEmptyWorkAmount = g.Sum(item => item.NonEmptyWork), 
     NonEmptyHomeAmount = g.Sum(item => item.NonEmptyHome) 
    }) 
    .OrderBy(item => item.Id) 
    .ToList(); 

以将其输出作为字典代替ToList:!

// Dictionary<string, YourType> 
    .ToDictionary(key => key.Id, value => value); 
+0

编号=(字符串)x.Attribute( “ID”)值X为未知的,.Count之间(W =>串.IsNullOrEmpty(w.InnerText))w.innertext也是未知的,但你给了理解的正确方向。 – Shazter

+0

谢谢我解决了你的帮助,看到答案 – Shazter

+0

作品完美和upvoted – Shazter