从列表中按组获取总持续时间

时间:2014-10-16 09:25:17

标签: c# linq

我有这个列表" userLoginTrials"并且必须执行以下操作:

  • 获取具有相同UserId和
  • 的每个项目
  • 检查" _logoutTimeStamp"不是空的
  • 然后计算" _trialTimeStamp"之间的差异。和" _logoutTimeStamp"这会导致持续时间。

简单:我必须获得列表中每个用户的总登录持续时间。

3 个答案:

答案 0 :(得分:3)

这应该可以完成这项任务(请注意,我使用了变量的无下划线版本,因为我认为它们对您的类是私有的):

var data = from u in userLoginTrials
           where u.LogoutTimeStamp != null
           group u by u.UserId into g
           select new
           {
               UserId = g.Key,
               TotalTime = g.Sum(t => t.LogoutTimeStamp - t.TrialTimeStamp)
           };

答案 1 :(得分:1)

您可以尝试以下内容:

var output = userLoginTrials.GroupBy(x=>x.UserId)
                            .Select(x=>new {
                                UserId = x.Key,
                                TotalDuration = x.Where(y=>y.LogoutTimeStamp!=null)
                                                 .Sum(y=>(y.LogoutTimeStamp-y.TrialTimeStamp))
                            });

最初,我们根据userLoginTrials列表中的对象创建一个组。然后,对于每个创建的组,我们创建一个具有属性的匿名类型的投影,一个是组的KeyUserId,另一个是用户的TotalDuration。为了实现后者,我们过滤了组的元素,以便使LogoutTimeStamp 的元素等于null。然后,我们将所有这些元素的总和归结为LogoutTimeStampTrialTimeStamp

之间的差异

<强>更新

正如DavidG在评论中正确指出的那样,更好的方法是:

var output = userLoginTrials.Where(x=>x.LogoutTimeStamp!=null)
                            .GroupBy(x=>x.UserId)
                            .Select(x=>new {
                                UserId = x.Key,
                                TotalDuration = x.Sum(y=>(y.LogoutTimeStamp-y.TrialTimeStamp))
                            });

这样,您只会使userLoginTrials列表中LogoutTimeStamp与[{1}}不同的项目,然后您将这些项目分组。

答案 2 :(得分:0)

var groups = userLoginTrials.GroupBy(u => u.UserId);
foreach(var group in groups)
{
    // group.Key is the UserId
    // group will contain an IEnumerable<UserLoginTrial> with that UserId
    foreach(var userLoginTrial in group)
    {
    // Add your logic here
    }
}