繁体   English   中英

C#Linq double groupby需要每天一次的最小值/最大值

[英]C# Linq double groupby need min/max for hourly values once per day

我已经玩了一段时间了,无法完全得到想要的结果。

我有一个这样的对象:

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小时的最小值/最大值/平均值。 目标是创建以下对象。

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;}
}

产生的目标是(标记/日期/低值/高值/平均值):

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语句。 一个按标签和日期分组以找到每个标签/日期的最小/最大/平均值,另一个按日期[0](或每个标签的不同日期)连同最小/最大/平均值一起传递给NewPoint对象。

欢迎咨询,谢谢!

根本不需要两个语句...也不需要使用字符串转换。 只需使用每个组的键和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是必需的,因为返回类型Averagedouble -你可能要考虑改变你的财产类型,而不是。

这种方法就是您追求的方法:

    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会进行更新以反映这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM