我有一个XML格式的产品数据库。对于每个产品,我的宽度为W,高度为H,价格为P。
考虑到具有W,H和P的产品,我想计算宽度小于W的产品数量,并计算高度小于W的产品数量。 H和那些价格< P.含义3个由计数产生的独立和独立数字。
使用C#有效的方法是什么?显然,我想只浏览一次XML文件中的每个元素。
XML文件由以下节点组成,并已读入XDocument对象:
<product><name>abc</name><W>7</W><H>3</H><P>40</P></product>
答案 0 :(得分:2)
这样的事情会起作用
XDocument doc = XDocument.Parse(xml);
int heightCount = 0;
int widthCount = 0;
int priceCount = 0;
int heightThreshold = 3;
int widthThreshold = 1;
int priceThreshold = 1;
foreach (var product in doc.Descendants("product"))
{
int height = Convert.ToInt32(product.Element("H").Value);
int width = Convert.ToInt32(product.Element("W").Value);
int price = Convert.ToInt32(product.Element("P").Value);
if (height < heightThreshold)
{
heightCount++;
}
if (width < widthThreshold)
{
widthCount++;
}
if (price < priceThreshold)
{
priceCount++;
}
}
虽然没有安全措施,但是如果你的product元素不包含每个H,W和P元素的整数值(或者这些元素中的一个不存在),它将会中断。您需要添加一些null和转换检查。
答案 1 :(得分:2)
var doc=XDocument.Parse(@"
<products>
<product>
<name>abc</name>
<W>7</W>
<H>3</H>
<P>40</P>
</product>
<product>
<name>abc</name>
<W>5</W>
<H>3</H>
<P>40</P>
</product>
<product>
<name>abc</name>
<W>6</W>
<H>3</H>
<P>40</P>
</product>
</products>");
int w=7,h=3,p=40;
var totals = doc
.Root
.Elements("product")
.Aggregate(
Tuple.Create(0,0,0),
(acc,el) =>
Tuple.Create(
acc.Item1 + (( (int)el.Element("W") ) < w ? 1 : 0),
acc.Item2 + (( (int)el.Element("H") ) < h ? 1 : 0),
acc.Item3 + (( (int)el.Element("P") ) < p ? 1 : 0)
)
);
会给出一个值为:
的元组结果2, 0, 0