我对linq很新,在下面的场景中我无法弄清楚如何让它为我工作,我看到了类似的问题但是无法获得/修改解决方案提供给我的场景。
我的情况是我从XML中提取数据,我将这些数据分组到一个值,得到计数,我也希望得到它的百分比。
我的数据看起来像这样。
Region | Code1 | Code2 | Code3
A 1 0 0
B 1 2 0
A 1 1 1
A 1 2 1
A 1 2 0
B 1 1 1
A 0 0 0
A 0 2 0
我需要返回的是按地区分组的数据,其中记录的百分比在3个代码字段中的任何一个中都有2。所以按地区分组然后计算包含属于该地区的2 /所有记录的记录。
我的第一部分的linq代码如下。
return from r in xdoc.Root.Elements("ROW")
group r by r.Element("Region").Value into grp
select new KeyValuePair<string, int>(grp.Key, grp.Count());
而且我不知道从哪里开始,我已经尝试了几次尝试在群组上方和群组下面发表一个让人发言但没有运气。当我把它放在群组之上时,它似乎无法在我的选择中访问。如果我把它放在我的小组声明之下,我不确定如何根据&#34; r&#34;来访问XML元素。
由于
答案 0 :(得分:2)
对于看起来像这样的XML:
<root>
<ROW>
<Region>A</Region>
<Code1>1</Code1>
<Code2>2</Code2>
<Code3>0</Code3>
</ROW>
<!-- More rows -->
<root>
计算具有Code1,Code2或Code3的元素等于&#34; 2&#34;然后应用百分比公式。
var xdoc = XDocument.Load("TextFile1.xml");
var result = from r in xdoc.Root.Elements("ROW")
group r by r.Element("Region").Value into g
let anyTwoCount = g.Count(r => r.Element("Code1").Value == "2"
|| r.Element("Code2").Value == "2"
|| r.Element("Code3").Value == "2")
select new KeyValuePair<string, int>(g.Key, anyTwoCount * 100 / g.Count());
答案 1 :(得分:1)
在您的选择中,您正在使用IGrouping,它也可以被认为是与其关联的密钥的IEnumerable。 如果您要迭代IGrouping,您将看到组中的XElements。
所以我相信你需要的是......
select new { Region = grp.Key, PercentTwos = grp.Count(elem => HasTwo(elem)) / grp.Count() }
或者如果你想使用KeyValuePair那么......
select new KeyValuePair<string, int>(grp.Key, grp.Count(elem => HasTwo(elem)) / grp.Count())
而不是select new KeyValuePair<string, int>(grp.Key, grp.Count())
这将显示每个区域中具有2的元素的百分比,方法是将元素数量计为2并除以总计数。我不确定你将如何确定元素中是否有一个2,所以我只是把一个HasTwo(elem)意味着某种谓词。
我不熟悉使用XML文件,所以请告诉我这是不是很有效(无法轻松测试)。