Obtener el valor usando Linq
Frecuentes
Visto 58 equipos
0
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 !!
2 Respuestas
1
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
0
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 linq c#-4.0 datatable or haz tu propia pregunta.
Just a detail : min value is 12 for 2014-5-27, not 30... - Raphaël Althaus