列表中的唯一日期

时间:2019-01-14 19:47:27

标签: c# arrays xml list

我正在尝试从XML文件中获取值并列出唯一的日期。 我在XML文件中获取日期,并且一天中有多个日期。

  1. 2018年1月1日。
  2. 2018年1月1日。
  3. 2018年2月1日。
  4. 2018年2月1日。
  5. 2018年3月1日。
  6. 2018年3月1日。
  7. 2018年4月1日。
  8. 2018年4月1日。

我想把所有这些日期都放成这样:

  1. 2018年1月1日。
  2. 2018年2月1日。
  3. 2018年3月1日。
  4. 2018年4月1日。

基本上,请对它们进行排序,并且最多要有一个相同的日期。

public static void ispisiAnalizuPoDanu()
    {
        List<Mjerenje> lMjerenja = UcitajMjerenja();
        /* kreirati listu jedinstvenih datuma */
        List<DateTime> jedinstveniDatumi = new List<DateTime>();
        DateTime zadnji = new DateTime();
        foreach (Mjerenje mjerenje in lMjerenja)
        {
            if (zadnji != mjerenje.datum)
            {
                jedinstveniDatumi.Add(mjerenje.datum);
            }
            zadnji = mjerenje.datum;
        }
        Console.WriteLine();


        List<AnalizaPoDanu> analizePoDanima = new List<AnalizaPoDanu>();

        foreach (DateTime datum in jedinstveniDatumi)
        {
            /* RAČUNANJE UKUPNOG BROJA MJERENJA */
            int total = 0;
            int zbroj = 0;
            int mini = lMjerenja[0].vrijednost;
            int maks = lMjerenja[0].vrijednost;
            int prosjek = 0;
            foreach (var mjerenje in lMjerenja)
            {
                if (mjerenje.datum == datum)
                {
                    total = total + 1;
                    zbroj = zbroj + mjerenje.vrijednost;
                    if(mjerenje.vrijednost < mini)
                    {
                        mini = mjerenje.vrijednost;
                    }
                    if(mjerenje.vrijednost > maks)
                    {
                        maks = mjerenje.vrijednost;
                    }
                }
            }

            prosjek = zbroj / total;
            var analizaPoDanu = new AnalizaPoDanu(
                datum,
                total,
                mini,
                maks,
                prosjek
                );
            analizePoDanima.Add(analizaPoDanu);


        }
        /*RAČUNANJE STANDARDNE DEVIJACIJE*/

        Console.WriteLine("Prikaz svih mjerenja po danu: ");
        var table = new ConsoleTable("Datum", "Total: ", "Min", "Max", "Prosjek: ");
        foreach (AnalizaPoDanu mjerenje in analizePoDanima)
        {
            table.AddRow(mjerenje.Datum.ToString("dd.MM.yyyy"), mjerenje.Total, mjerenje.Min, mjerenje.Max, mjerenje.Prosjek);
        }
        table.Write();
        Console.WriteLine();
    }

数据样本:

<data>
<Mjerenja>
<Mjerenje id="1"  vrijednost="3" dan="1" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="2"  vrijednost="4" dan="1" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="3"  vrijednost="5" dan="3" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="4"  vrijednost="6" dan="4" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="5"  vrijednost="7" dan="5" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="6"  vrijednost="8" dan="6" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="7"  vrijednost="9" dan="7" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="8"  vrijednost="10" dan="2" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="9"  vrijednost="5" dan="2" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="10"  vrijednost="7" dan="4" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="11"  vrijednost="2" dan="6" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="12"  vrijednost="4" dan="5" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="13"  vrijednost="12" dan="5" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="14"  vrijednost="10" dan="3" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="15"  vrijednost="2" dan="7" mjesec="1" godina="2018"></Mjerenje>
<Mjerenje id="16"  vrijednost="3" dan="1" mjesec="1" godina="2018"></Mjerenje>    

    

2 个答案:

答案 0 :(得分:0)

尝试按照xml linq进行操作:

using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication94
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            var results = doc.Descendants("Mjerenje").Select(x => new {
                id = (string)x.Attribute("id"),
                vrijednost = (int)x.Attribute("vrijednost"),
                date = new DateTime((int)x.Attribute("godina"), (int)x.Attribute("mjesec"), (int)x.Attribute("dan"))
            }).ToList();

            var groups = results.GroupBy(x => x.date).ToList();
        }
    }
}

答案 1 :(得分:0)

假设您使用的是以下课程(我将使用英文名称,因此每个人都可以阅读):

class Measurement // Mjerenje
{
    public double Value { get; set; }
    public DateTime Date { get; set; }
}

class AnalysisPerDay // AnalizaPoDanu
{
    public DateTime Date { get; set; }
    public int Count { get; set; }
    public double Min { get; set; }
    public double Max { get; set; }
    public double Average { get; set; }
}

,并且您已经阅读并将XML文件转换为列表:

List<Measurement> measurements = LoadMesaurements(); // UcitajMjerenja()

您可以按天分组并使用LINQ计算统计信息:

List<AnalysisPerDay> analysis = measurements.
    GroupBy(m => m.Date)
    .Select(g => new AnalysisPerDay {
        Date = g.Key,
        Count = g.Count(),
        Min = g.Min(m => m.Value),
        Max = g.Max(m => m.Value),
        Average = g.Average(m => m.Value),
    })
    .ToList();

要理解该查询,请注意GroupBy在参数IGrouping<DateTime, Measurement>中创建类型为g的组。

g具有包含日期​​的Key属性,并且是包含一天中所有测量值的IEnumerable<Measurement>