質問
以下のXMLを考えると、InputItemでグループ化し、すべての年のコストを合計する必要があります。結果は次のようになります。
- 研究契約、7000
- 技術契約、5000
- ホスピタリティ、2000
XMLは次のとおりです。
<Inputs>
<Inputs_Table_Row>
<InputItem>Research Contracts</InputItem>
<TotalYear1>1000</TotalYear1>
<TotalYear2>2000</TotalYear2>
</Inputs_Table_Row>
<Inputs_Table_Row>
<InputItem>Research Contracts</InputItem>
<TotalYear1>2000</TotalYear1>
<TotalYear2>2000</TotalYear2>
</Inputs_Table_Row>
<Inputs_Table_Row>
<InputItem>Technical Contracts</InputItem>
<TotalYear1>1000</TotalYear1>
<TotalYear2>2000</TotalYear2>
</Inputs_Table_Row>
<Inputs_Table_Row>
<InputItem>Technical Contracts</InputItem>
<TotalYear1>1000</TotalYear1>
<TotalYear2>1000</TotalYear2>
</Inputs_Table_Row>
<Inputs_Table_Row>
<InputItem>Hospitality</InputItem>
<TotalYear1>1000</TotalYear1>
<TotalYear2>1000</TotalYear2>
</Inputs_Table_Row>
</Inputs>
これまでのグループ化の試みは単純ですが、成功しませんでした:
XDocument doc = XDocument.Load(@"c:\temp\CrpTotalsSimple.xml");
var query = from c in doc.Descendants("Inputs_Table_Row")
group new
{
Item = (string)c.Element("InputItem")
}
by c.Element("InputItem")
into groupedData
select new
{
ItemName = groupedData.Key.Value
};
foreach (var item in query)
Console.WriteLine(String.Format("Item: {0}", item.ItemName));
どうすれば修正できますか?
解決 2
group by句でValueを使用していないように見えます。私の作業ソリューションは次のとおりです。
var query = from c in doc.Descendants("Inputs_Table_Row")
group new
{
Item = c.Element("InputItem").Value,
ItemValue = (int)c.Element("TotalYear1") + (int)c.Element("TotalYear2")
}
by c.Element("InputItem").Value
into groupedData
select new
{
ItemName = groupedData.Key,
ItemTotal = groupedData.Sum(rec => rec.ItemValue)
};
他のヒント
次のようなものが必要です...
var query = from yearTotalEl in doc.Descendants()
where yearTotalEl.Name.LocalName.StartsWith("TotalYear")
group (decimal)yearTotalEl
by (string)yearTotalEl.Parent.Element("InputItem") into g
select new {ItemName = g.Key, Sum = g.Sum()};
小数部分を持つ通貨を扱っていると思われるため、 decimal
を使用しています。
所属していません StackOverflow