我有这个列表" userLoginTrials"并且必须执行以下操作:
简单:我必须获得列表中每个用户的总登录持续时间。
答案 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
列表中的对象创建一个组。然后,对于每个创建的组,我们创建一个具有属性的匿名类型的投影,一个是组的Key
,UserId
,另一个是用户的TotalDuration
。为了实现后者,我们过滤了组的元素,以便使LogoutTimeStamp
不的元素等于null。然后,我们将所有这些元素的总和归结为LogoutTimeStamp
和TrialTimeStamp
。
<强>更新强>
正如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
}
}