C#Linq XML GroupBy OrderBy get count
我有这个xml结构,需要非空工作和家庭元素的计数、groupby Country属性和orderby Country属性 类似于Dictionary>,但我无法使用linq表达式。目前,该列表仅经过筛选、groupby和orderby。缺少的部分是计数非空工作和家庭元素。 是否可以在查询中无限地执行此操作,或者应该在查询列表后使用 xml文件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 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(变为绿色)。关于第二个问题,我将不得不看到一些代码-但也。。。后续问题应作为单独的问题发布。。如果您无法解决该错误,请发布一个问题,如果您想在评论中标记我,我将尝试帮助:)