linq 发现范围数量之间是否存在差距的最佳方法是什么?

nszi6y05  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(119)

我每天都让员工打卡上班,有时他们第二天还在工作,没有休息。
我需要的是没有休息,午夜结束的员工的总小时数。
例如
| 工作人员|开始|完|
| - ------|- ------|- ------|
| 工作人员A|上午9时|下午3点|
| 工作人员A|下午3点|晚上10点|
| 工作人员A|晚上10点|* * 上午12:00**|
| 工作人员B|上午3时|晚上9点|
| 工作人员B|晚上10点|* * 上午12:00**|
| 工作人员C|上午3时|晚上9点|
| 工作人员D|晚上10点|* * 上午12:00**|
在上表中,两名员工都在午夜完成工作。
员工A工作了15个小时,没有任何休息。但员工B在晚上9点到10点之间休息。
预期结果:
| 工作人员|共计|
| - ------|- ------|
| 工作人员A|十五|
| 工作人员B|第二章|
| 工作人员C|0,因为他午夜还没完成。|
| 工作人员C|第二章|
我尝试了for循环,但是失败了,因为每个员工有不同的条目数,代码在最后变得混乱。
我尝试了LINQ和加入同一个表等,但无法弄清楚。
这个网站是我最后的选择。
事先谢谢你的帮助。

vq8itlhq

vq8itlhq1#

好的,如果你需要跨日期或多个日期的工作段,这个答案需要更多的工作。这里假设所有的工作段都在同一天。
以下代码按员工对所有段进行分组,然后将每个段的总分钟数相加。然后,仅当最后一个段在午夜结束时才返回总分钟数。
此测试代码返回以下内容:

Staff A: 15
Staff B: 20
Staff C: 0
Staff D: 2

下面是代码:

void Main()
{
    var segments = GetTestData();
    DateTime midnight = DateTime.Now.AddDays(1).Date;
    var results = segments
        .GroupBy(s => s.Name)
        .Select(grp => 
            new {
                Name = grp.Key, 
                Total = grp.Max(g => g.EndDate) == midnight 
                    ? grp.Sum(g => g.EndDate.Subtract(g.StartDate).TotalMinutes) 
                    : 0
            });

    foreach (var result in results)
    {
        Console.WriteLine($"{result.Name}: {result.Total/60F:#,##0}");
    }
}

class Segment
{
    public string Name { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

Segment[] GetTestData()
{
    return new[]
    {
        new Segment { Name = "Staff A", StartDate = new DateTime(2023, 1, 18, 9 , 0, 0), EndDate = new DateTime(2023, 1, 18, 15, 0, 0) },
        new Segment { Name = "Staff A", StartDate = new DateTime(2023, 1, 18, 15, 0, 0), EndDate = new DateTime(2023, 1, 18, 22, 0, 0) },
        new Segment { Name = "Staff A", StartDate = new DateTime(2023, 1, 18, 22, 0, 0), EndDate = new DateTime(2023, 1, 19, 0 , 0, 0) },
        new Segment { Name = "Staff B", StartDate = new DateTime(2023, 1, 18, 3 , 0, 0), EndDate = new DateTime(2023, 1, 18, 21, 0, 0) },
        new Segment { Name = "Staff B", StartDate = new DateTime(2023, 1, 18, 22, 0, 0), EndDate = new DateTime(2023, 1, 19, 0 , 0, 0) },
        new Segment { Name = "Staff C", StartDate = new DateTime(2023, 1, 18, 3 , 0, 0), EndDate = new DateTime(2023, 1, 18, 21, 0, 0) },
        new Segment { Name = "Staff D", StartDate = new DateTime(2023, 1, 18, 22, 0, 0), EndDate = new DateTime(2023, 1, 19, 0 , 0, 0) }
    };
}

相关问题