【问题标题】:Find average and max time after grouping with linq使用 linq 分组后查找平均和最大时间
【发布时间】:2017-09-19 21:57:59
【问题描述】:

给定以下课程:

public class SessionData
{
    public Guid Session { get; set; }
    public DateTime Date { get; set; }
}

并列出清单:

public static List<SessionData> GetSessionData()
{
    Guid guid1 = Guid.NewGuid();
    Guid guid2 = Guid.NewGuid();

    List<SessionData> sessionData = new List<SessionData>
    {
        new SessionData {Session = guid1, Date = DateTime.UtcNow.AddMinutes(3)},
        new SessionData {Session = guid1, Date = DateTime.UtcNow.AddMinutes(2)},
        new SessionData {Session = guid2, Date = DateTime.UtcNow.AddMinutes(5)},
        new SessionData {Session = guid2, Date = DateTime.UtcNow.AddMinutes(4)},
        new SessionData {Session = guid1, Date = DateTime.UtcNow.AddMinutes(20)},
        new SessionData {Session = guid1, Date = DateTime.UtcNow.AddMinutes(25)},
        new SessionData {Session = guid2, Date = DateTime.UtcNow.AddMinutes(20)},
        new SessionData {Session = guid1, Date = DateTime.UtcNow.AddMinutes(1)},
    };

    return sessionData;
}

我想找到会话的平均持续时间 (1) 和最长的会话 (2)。还有每天(3),每周(4),每月(5),每年(6),总共(7)有多少次?

我试图从

var list = (from t in sessionData group t.Date by t.Session).ToList();

并尝试找到每个会话的持续时间(最大日期 - 最小日期)并从那里继续。有没有更好的方法可以直接使用 Linq 进行这些计算?

【问题讨论】:

  • “平均会话持续时间”是什么意思?就像数字一样,您拥有什么以及您期望得到什么?
  • 会话持续时间如何确定?你需要一个开始和结束时间
  • @Nkosi 我问了同样的问题,但我的猜测是每个会话都有一个起点,结束是列表中的下一个会话开始时,但列表没有排序...还
  • 实际上会话 guid 确定“会话”。从那里开始,我将不得不在每个会话 guid 之后进行扩展,并计算第一个日期和最后一个日期之间的差异(当然是在订购之后),以找到该特定“会话”的持续时间。基本上,这是多租户聊天机器人编排平台的密集日志记录的过度简化的数据量,我们希望对管理人员的仪表板有更好的了解。
  • 您有性能问题吗?还是只是如何做的问题?

标签: c# linq


【解决方案1】:
var sessionData = GetSessionData();

var longestSession = sessionData
    .GroupBy(sd => sd.Session)
    .Select(group => new Tuple<Guid, TimeSpan>(group.First().Session, group.Max(sd => sd.Date) - group.Min(sd => sd.Date)))
    .OrderBy(tuple => tuple.Item2)
    .Last()
    .Item1;

var averageDuration = sessionData
    .GroupBy(sd => sd.Session)
    .Select(group => new Tuple<Guid, TimeSpan>(group.First().Session, group.Max(sd => sd.Date) - group.Min(sd => sd.Date)))
    .Average(tuple => tuple.Item2.Minutes);

对于您的其他问题,我没有即时的 LINQ 解决方案,我会尽快更新。

【讨论】:

  • 似乎已经为这些工作了。是否也可以以from s in sessionData group by ... 的方式编写这些?
  • 很抱歉,查询表达式语法无法帮助您...而且查询表达式也有一些限制,所以我不确定是否可以使用这些...
  • 将此标记为答案,因为它已经给了我关于如何采取替代方法来实现我的目标的第一个指示。
猜你喜欢
  • 2021-01-15
  • 2014-06-11
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2020-12-28
相关资源
最近更新 更多