首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# Linq双组每天每小时一次需要最小/最大值

C# Linq双组每天每小时一次需要最小/最大值
EN

Stack Overflow用户
提问于 2015-05-15 13:37:58
回答 2查看 925关注 0票数 1

我已经玩了很长一段时间了,不能完全得到我想要的结果。

我有一个这样的物体:

代码语言:javascript
运行
复制
public class Point
{
    public string Tag {get;set;}
    public DateTime Time {get;set;}
    public int Value {get;set;}
}

每个标签每天有24个值(每小时一个)。数据如下所示(标记/时间/值):

代码语言:javascript
运行
复制
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。目标是创建以下对象。

代码语言:javascript
运行
复制
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):

代码语言:javascript
运行
复制
x / 5-15-2015 / 10 / 30 / 20 
y / 5-15-2015 / 20 / 30 / 25 
x / 5-16-2015 / 10 / 10 / 10 

我对以下问题有意见:

代码语言:javascript
运行
复制
group list by new {list.Tag, list.Time.ToString("d") } into dateGroup

我也认为我需要两个linq声明。一个按标记和日期分组以查找每个标记/日期的min/max/avg,另一个将获取日期0以及min/max/avg传递给NewPoint对象。

欢迎指教,谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-15 13:45:38

根本不需要两句话..。也不使用字符串转换。只需使用每个组的键和DateTime.Date属性:

代码语言:javascript
运行
复制
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 --您可能需要考虑更改属性类型。

票数 6
EN

Stack Overflow用户

发布于 2015-05-15 13:49:45

就像你想要的一样:

代码语言:javascript
运行
复制
    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以反映这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30260942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档