我想要做的是从不同时间的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小时平均值的条件?有什么想法吗?
答案 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();