C#Linq XML GroupBy OrderBy get count

C#Linq XML GroupBy OrderBy get count,c#,xml,linq,C#,Xml,Linq,我有这个xml结构,需要非空工作和家庭元素的计数、groupby Country属性和orderby Country属性 类似于Dictionary>,但我无法使用linq表达式。目前,该列表仅经过筛选、groupby和orderby。缺少的部分是计数非空工作和家庭元素。 是否可以在查询中无限地执行此操作,或者应该在查询列表后使用 xml文件 <?xml version="1.0" encoding="utf-8"?> <Root> <Region ID="

我有这个xml结构,需要非空工作和家庭元素的计数、groupby Country属性和orderby Country属性

类似于Dictionary>,但我无法使用linq表达式。目前,该列表仅经过筛选、groupby和orderby。缺少的部分是计数非空工作和家庭元素。 是否可以在查询中无限地执行此操作,或者应该在查询列表后使用

xml文件

<?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>

克沃茨
555-666
111-666
ASDF
111-222
111-222
ASDF
111-222
方法

 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();
}
公共静态列表getgrouped(字符串文件名)
{
XDocument xml=XDocument.Load(文件名);
返回xml.Root
.后代(“国家”)
.GroupBy(x=>(字符串)x.Attribute(“ID”).Value)
.OrderBy(g=>g.Key)
.ToList();
}

对于每个子代,我投影一个对象,其中包含国家id和非空子代
工作
家庭
元素的数量。然后我
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);
//字典
.ToDictionary(key=>key.Id,value=>value);

Id=(string)x.Attribute(“Id”)。值x未知,.Count(w=>!string.IsNullOrEmpty(w.InnerText))w.InnerText也未知,但您给出了正确的理解方向。我必须找到“解决”按钮,但还有一个问题与您的解决方案相关。如果我想选择进入,那么由于protectlevel,我将无法访问,但是该类是公共的,并且属性是公共的,带有get和set@Shazter-关于已解决的标记,然后根据答案的票数,按下灰色V(变为绿色)。关于第二个问题,我将不得不看到一些代码-但也。。。后续问题应作为单独的问题发布。。如果您无法解决该错误,请发布一个问题,如果您想在评论中标记我,我将尝试帮助:)