我有一个包含对象的列表,如下所示:
身份证 |项目编号 |项目时间 |更多。。。。
我正在尝试获得一个带有ProjectTime
总和的独特ProjectID
列表。
问题是ProjectTime是这种格式的字符串 HH:mm 例如:06:30
。
使用 LINQ,我可以将列表与GroupBy
分组,但 LINQ 的 Sum 函数不接受字符串。
我无法更改项目时间的类型!
var overviewList = tmpList.GroupBy(x => x.ProjectID)
.Select(x => new
{
ProjectID = x.Key,
ProjectTime = x.Sum(o => int.Parse(o.ProjectTime)) //Wrong
});
在这里,您必须使用两件事的组合:
-
将字符串转换为可用的格式,即使用如何将字符串"07:35"(HH:MM(转换为TimeSpan的TimeSpan
。 -
在 C# 中使用时间跨度总和的时间跨度总和
public class Toto
{
public int ProjectID { get; set; }
public string ProjectTime { get; set; }
}
static void Main(string[] args)
{
var tmpList = new[]{
new Toto{ProjectID=1, ProjectTime="00:10" },
new Toto{ProjectID=2, ProjectTime="23:20" },
new Toto{ProjectID=2, ProjectTime="23:30" },
new Toto{ProjectID=1, ProjectTime="00:40" },
};
var overviewList = tmpList.GroupBy(x => x.ProjectID)
.Select(x => new
{
ProjectID = x.Key,
ProjectTime = new TimeSpan(x.Sum(o => TimeSpan.Parse(o.ProjectTime).Ticks))
});
结果:
项目 ID =1,项目时间 =00:50:00 项目 ID =2,项目时间 =1.22:50:00
该1.22:50:00
可能不是您期望的格式。但是时间跨度自定义格式在这里不会有用。
如果您需要再次获取相同的字符串格式。您可以使用,但只要您使用 TimeSpan 格式,它就保留它仅用于显示。
(int)X.ProjectTime.TotalHours +":" +X.ProjectTime.Minutes
项目 ID =1, 项目时间 = 0:50 项目ID =2, 项目时间 =46:50
假设您需要字符串作为 ProjectTime,这可以帮助您:
var overviewList = tmpList.GroupBy(x => x.ProjectID)
.Select(x => new
{
ProjectID = x.Key,
ProjectTime = x.Sum(o => TimeSpan.Parse(o.ProjectTime).TotalMinutes)).ToString()
});
尝试:
var overviewList = tmpList
.Select(i => new { ProjectId = i.ProjectId,
Ts = TimeSpan.Parse(i.ProjectTime) })
.GroupBy(i => i.ProjectId)
.Select(g => new { ProjectId = g.Key,
Hour = g.Sum(i => i.Ts) })
.ToList();