代码之家  ›  专栏  ›  技术社区  ›  Kris van der Mast

使用linq分组后查找平均和最大时间

  •  2
  • Kris van der Mast  · 技术社区  · 8 年前

    给定以下类别:

    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();
    

    1 回复  |  直到 8 年前
        1
  •  0
  •   Harry Preiß    8 年前
    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解决方案,我会尽快更新我有一个想法。