Obtener el valor usando Linq

I am trying to get the max , min and average value from datatable using Linq , but some how not able to fount the solution .

Any solution or suggestion is appreciated .

This is datatable (for reference purpose only)

DataTable[] duprawdat = new DataTable[1];
duprawdat[0] = new DataTable();
duprawdat[0].Columns.Add("first");
duprawdat[0].Columns.Add("second");
duprawdat[0].Columns.Add("third");
duprawdat[0].Rows.Add(1,12,"2014-5-27 03:00:00");
duprawdat[0].Rows.Add(2,30,"2014-5-27 05:00:00");
duprawdat[0].Rows.Add(3,42,"2014-5-27 04:00:00");
duprawdat[0].Rows.Add(4, 2, "2014-5-26 02:00:00");
duprawdat[0].Rows.Add(5, 4, "2014-5-25 07:00:00");
duprawdat[0].Rows.Add(6, 42, "2014-5-25 04:00:00");

After this i tried as:-

var _result22 =  duprawdat[0]
 .AsEnumerable()
 .GroupBy(r1 => new
 {
     time = r1.Field<int>("third"),
     val = r1.Field<int>("second")
 }).Select(g => new
 {
     t = g.Key.time,
     v = g.Key.val,
     TotalMark = g.Sum(x => x.Field<int>("Value"))
 });

After this if it is coorect i am fetting errors in iterating values .

The result i am looking for should be in such a way .

Date = 2014-5-27 , Max value = 42 , Min Value = 30 Similarly for other dates also !!

preguntado el 28 de mayo de 14 a las 12:05

Just a detail : min value is 12 for 2014-5-27, not 30... -

2 Respuestas

So I would do some changes

first, strong types in your datatable (I changed also the column names for clarity).

        DataTable[] duprawdat = new DataTable[1];
        duprawdat[0] = new DataTable();
        duprawdat[0].Columns.Add("id", typeof(int));
        duprawdat[0].Columns.Add("val", typeof(int));
        duprawdat[0].Columns.Add("dt", typeof(DateTime));

        duprawdat[0].Rows.Add(1, 12, "2014-5-27 03:00:00");
        duprawdat[0].Rows.Add(2, 30, "2014-5-27 05:00:00");
        duprawdat[0].Rows.Add(3, 42, "2014-5-27 04:00:00");
        duprawdat[0].Rows.Add(4, 2, "2014-5-26 02:00:00");
        duprawdat[0].Rows.Add(5, 4, "2014-5-25 07:00:00");
        duprawdat[0].Rows.Add(6, 42, "2014-5-25 04:00:00");

Entonces puedes hacer

        var _result22 = duprawdat[0]
            .AsEnumerable()
            //this select is just to simplify the rest of the code, not a "must-have"
            .Select(m => new
            {
                dt = m.Field<DateTime>("dt"),
                val = m.Field<int>("val")
            })
            //goup by Date part of datetime only
            .GroupBy(m => m.dt.Date)
            .Select(m => new
            {
                date = m.Key,
                minVal = m.Min(x => x.val),
                maxVal = m.Max(x => x.val),
                avgVal = m.Average(x => x.val)
            })
            .ToList();

contestado el 28 de mayo de 14 a las 13:05

This is what i was looking for Thanks @Raphaël Althaus . MArking tTiS as Answer - user1260967

prueba este

var result = duprawdat[0]
    .AsEnumerable()
    .GroupBy(x => new { time = x.Field<DateTime>("third").Date})
    .Select(y=>new{ time=y.Key,ids=y.ToList(), max=y.ToList()
    .Max(z=>z.Field<int>("second")),
min = y.ToList().Min(z=>z.Field<int>("second"))});

contestado el 28 de mayo de 14 a las 15:05

You answer may even solve the issue, but it is highly recommended that you describe what your code is doing. - Bonifacio2

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.