我已经玩了很长一段时间了,不能完全得到我想要的结果。
我有一个这样的物体:
public class Point
{
public string Tag {get;set;}
public DateTime Time {get;set;}
public int Value {get;set;}
}每个标签每天有24个值(每小时一个)。数据如下所示(标记/时间/值):
x / 5-15-2015 - 0100 / 10
x / 5-15-2015 - 0200 / 20
x / 5-15-2015 - 0300 / 30
y / 5-15-2015 - 0100 / 20
y / 5-15-2015 - 0200 / 30
x / 5-16-2015 - 0100 / 10 例如..。
我想按标签和日期进行排序,然后得到每天24小时的min/max/avg。目标是创建以下对象。
Public class NewPoint
{
public string Tag {get;set;}
public DateTime Date {get;set;}
public int LowValue {get;set;}
public int HighValue {get;set;}
public int AvgValue {get;set;}
}其结果将是(Tag / Date / LowValue / HighValue / AvgValue):
x / 5-15-2015 / 10 / 30 / 20
y / 5-15-2015 / 20 / 30 / 25
x / 5-16-2015 / 10 / 10 / 10 我对以下问题有意见:
group list by new {list.Tag, list.Time.ToString("d") } into dateGroup我也认为我需要两个linq声明。一个按标记和日期分组以查找每个标记/日期的min/max/avg,另一个将获取日期0以及min/max/avg传递给NewPoint对象。
欢迎指教,谢谢!
发布于 2015-05-15 13:45:38
根本不需要两句话..。也不使用字符串转换。只需使用每个组的键和DateTime.Date属性:
var query = list.GroupBy(x => new { x.Tag, x.Time.Date })
.Select(g => new NewPoint
{
Tag = g.Key.Tag,
Date = g.Key.Date,
LowValue = g.Min(x => x.Value),
HighValue = g.Max(x => x.Value),
AvgValue = (int) g.Average(x => x.Value)
});AvgValue的强制转换是必需的,因为Average的返回类型是double --您可能需要考虑更改属性类型。
发布于 2015-05-15 13:49:45
就像你想要的一样:
public class Point
{
public string Tag { get; set; }
public DateTime Time { get; set; }
public int Value { get; set; }
}
public class NewPoint
{
public string Tag {get;set;}
public DateTime Date {get;set;}
public int LowValue {get;set;}
public int HighValue {get;set;}
public double AvgValue {get;set;}
}
public List<NewPoint> Summary(List<Point> list)
{
return list
.GroupBy(p => new {p.Tag, p.Time.Date})
.Select(grp => new NewPoint()
{
Tag = grp.Key.Tag,
Date = grp.Key.Date,
LowValue = grp.Min(p => p.Value),
HighValue = grp.Max(p => p.Value),
AvgValue = grp.Average(p => p.Value),
})
.ToList();
}注意,平均值是双倍的,因此更新了NewPoint以反映这一点。
https://stackoverflow.com/questions/30260942
复制相似问题