LINQ (C#) 对 HH:mm 格式的字符串求和



我有一个包含对象的列表,如下所示:

身份证 |项目编号 |项目时间 |更多。。。。

我正在尝试获得一个带有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
});

在这里,您必须使用两件事的组合:

  1. 将字符串转换为可用的格式,即使用如何将字符串"07:35"(HH:MM(转换为TimeSpan的TimeSpan

  2. 在 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();

最新更新