来自xml节点的平均值

时间:2014-02-09 14:25:45

标签: c# xml

我想要做的是从不同时间的xml节点属性中获取平均值。 我的xml结构如下:

<logs>
  <log value="1" dateTime="Sun, 09 Feb 2014 08:00 am CET"/>
  <log value="1" dateTime="Sun, 09 Feb 2014 09:00 am CET"/>
  <log value="1" dateTime="Sun, 09 Feb 2014 10:00 am CET"/>
  <log value="5" dateTime="Sun, 09 Feb 2014 11:00 am CET"/>
  <log value="3" dateTime="Sun, 09 Feb 2014 12:00 am CET"/>
  <log value="7" dateTime="Sun, 09 Feb 2014 13:00 am CET"/>
  <log value="3" dateTime="Sun, 09 Feb 2014 14:00 am CET"/>
</log>

我想计算过去5小时的平均值,并在标签中写入值。我的代码是这样的:

xdoc2.Load("data.xml");
 XmlNodeList n = xdoc2.GetElementsByTagName("log");
            List<int> values = new List<int>();
            foreach (XmlNode curr in n)
            {
                int date;
                date = Convert.ToInt32(curr.Attributes["dateTime"].InnerText);
                DateTime date1 = Convert.ToDateTime(date);
                if (date1.Hour != date1.Hour)
                   values.Add(Convert.ToInt32(curr.Attributes["value"].InnerText));
            }
            double average = values.Average();
            label4.Text = Convert.ToString(average);

如何添加计算过去5小时平均值的条件?有什么想法吗?

3 个答案:

答案 0 :(得分:0)

var average = (from node in n
               let date = Convert.ToDateTime(Convert.ToInt32(node.Attributes["dateTime"].InnerText))
               orderby date 
               select Convert.ToInt32(curr.Attributes["value"].InnerText)
               .Take(5)
               .Average();

答案 1 :(得分:0)

您可以将日期相互比较。例如:

        DateTime d = DateTime.Now.AddHours(-5);
        DateTime d2 = Convert.ToDateTime("23.01.2013");
        if (d > d2){
            MessageBox.Show(d.ToString() + " " + d2.ToString());
        } else {
            MessageBox.Show("nope");
        }

通过比较日期,如果日期小于DateTime.Now.AddHours(-5),您可以轻松遍历xml并进行比较。

在你的例子中,它将是这样的:

 foreach (XmlNode curr in n)
        {
            int date;
            date = Convert.ToInt32(curr.Attributes["dateTime"].InnerText);
            DateTime date1 = Convert.ToDateTime(date);
            DateTime now = DateTime.Now.AddHours(-5);
            if (date1>=now)
               values.Add(Convert.ToInt32(curr.Attributes["value"].InnerText));
        }

之后你可以像你已经完成的那样进行平均计算:

        double average = values.Average();
        label4.Text = Convert.ToString(average);

答案 2 :(得分:0)

var fromDate = DateTime.Now.AddHours(-5);
label4.Text = xdoc2.Descendants("log")
                   .Where(x => DateTime.ParseExact(x.Attribute("dateTime").Value, @"ddd, dd MMM yyyy HH:mm a\m CE\T", CultureInfo.InvariantCulture) > fromDate )
                   .Average(x => Convert.ToInt32(x.Attribute("value").Value)).ToString();