2014-02-09 6 views
-2

У меня есть xml, который показывает дату/время и объем значения в аргументах. XML выглядит следующим образом:Рассчитать среднее значение из 5 последних дат в xml C#

<data volume="1" date="Tue, 04 Feb 2014 10:00 am CET"/> 
<data volume="5" date="Wed, 05 Feb 2014 10:00 am CET"/> 
<data volume="1" date="Thu, 06 Feb 2014 10:00 am CET"/> 
<data volume="2" date="Fri, 07 Feb 2014 12:00 pm CET"/> 
<data volume="3" date="Fri, 07 Feb 2014 10:00 am CET"/> 
<data volume="4" date="Sat, 08 Feb 2014 12:00 am CET"/> 
<data volume="4" date="Sat, 08 Feb 2014 10:00 am CET"/> 
<data volume="1" date="Sun, 09 Feb 2014 10:00 am CET"/> 

Я хочу, чтобы вычислить средний объем за последние 5 дней, что будет 09 февраля - февраль 05. Как я могу сделать это в C#? И еще один вопрос, как я могу рассчитать средний объем с дня, который имеет несколько раз? Как

<data volume="2" date="Fri, 07 Feb 2014 12:00 pm CET"/> 
<data volume="3" date="Fri, 07 Feb 2014 10:00 am CET"/> 

Вот мой код до сих пор:

 XmlNodeList nodes = xdoc2.SelectNodes("data"); 

     foreach (XNode n in nodes) 
     { } 
+0

что вы пробовали? – Damith

+0

Что я сделал - это взять дату атрибута последнего узла и сохранить его в локальной переменной. После этого я не знаю, как взять другие даты. – user2962759

+1

Показать свой код. –

ответ

3

Вы можете использовать Linq для XML, ниже даст вам некоторое представление о том, чтобы начать

var xelement = XElement.Parse(@"<root> 
<data volume=""1"" date=""Tue, 04 Feb 2014 10:00 am CET""/> 
<data volume=""5"" date=""Wed, 05 Feb 2014 10:00 am CET""/> 
<data volume=""1"" date=""Thu, 06 Feb 2014 10:00 am CET""/> 
<data volume=""2"" date=""Fri, 07 Feb 2014 12:00 pm CET""/> 
<data volume=""3"" date=""Fri, 07 Feb 2014 10:00 am CET""/> 
<data volume=""4"" date=""Sat, 08 Feb 2014 12:00 am CET""/> 
<data volume=""4"" date=""Sat, 08 Feb 2014 10:00 am CET""/> 
<data volume=""1"" date=""Sun, 09 Feb 2014 10:00 am CET""/> 
</root>"); 

var fiveItems = xelement.Elements("data") 
.Select(x=> new{Date = DateTime.Parse(x.Attribute("date").Value.TrimEnd("CET".ToCharArray())) 
       ,Volume = int.Parse(x.Attribute("volume").Value)}) 
.GroupBy(x=>x.Date.Date) 
.Select(x=> new{ Date = x.Key, Volume = x.Average(k=>k.Volume)}) 
.OrderByDescending(x=>x.Date) 
.Take(5); 

, если загрузка из файла

XDocument doc = XDocument.Load("data.xml"); 
var fiveItems = doc.Elements("data") 
.Select(x=> new{Date = DateTime.Parse(x.Attribute("date").Value.TrimEnd("CET".ToCharArray())) 
       ,Volume = int.Parse(x.Attribute("volume").Value)}) 
.GroupBy(x=>x.Date.Date) 
.Select(x=> new{ Date = x.Key, Volume = x.Average(k=>k.Volume)}) 
.OrderByDescending(x=>x.Date) 
.Take(5); 

выше рассчитает среднее значение в течение 5 дней. если вы хотите рассчитать среднее значение за эти пять дней снова, сделайте, как показано ниже

TextBox1.Text = fiveItems.Average(x=>x.Volume); 
+0

Я использую данные из файла data.xml – user2962759

+0

, что я думал, если имеется более одного данных с той же даты, возьмите самый высокий и самый низкий объем, вычислите среднее значение, так что среднее значение будет равно том для этого дня – user2962759

+0

как я могу показать вычисленное среднее значение в текстовом поле? – user2962759

Смежные вопросы