如何使用C#和XML有效地计算?

时间:2012-02-16 01:02:10

标签: c# xml

我有一个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>

2 个答案:

答案 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