c# - 计算 block 中的中断

标签 c#

任何人都可以帮我计算发生的 block 之间的中断吗? 这是我的类(class),在我的列表中,我从 block 中获取开始和结束时间:

private class Block
{
  public DateTime Start { get; set; }
  public DateTime End { get; set; }
}        

这就是列表中时间的样子

 List<Block> blocks = new List<Block>();

enter image description here

[0] = End{12/30/1899 11:45:00 AM}
[0] = Start{12/30/1899 8:30:00 AM}
[1] = End{12/30/1899 5:00:00 PM}
[1] = Start{12/30/1899 1:15:00 PM}

现在我想要到达和出发时间(即开始和停止之间的阻塞时间)来计算它们的总和。

public class Presence
{
  public DateTime arrival   { get; set; }
  public DateTime departure { get; set; }
}

List<Presence> presence = new List<Presence>();

time received in the presence list:
arrival                     departure 
1899-12-30 08:03:00.000;    1899-12-30 09:21:00.000
1899-12-30 09:36:00.000;    1899-12-30 10:34:00.000
1899-12-30 10:45:00.000;    1899-12-30 12:05:00.000
1899-12-30 13:03:00.000;    1899-12-30 14:24:00.000
1899-12-30 14:34:00.000;    1899-12-30 16:14:00.000
1899-12-30 16:27:00.000;    1899-12-30 18:02:00.000

这是我尝试计算区 block (开始和停止)之间的(到达 - 出发),但不是正确的结果,我怎样才能正确地做到这一点?

  double sumOfBreakOfBlocks = presence.Where(x => blocks.Any(b =>( x.arrival > b.Start && x.arrival > b.End) && x.arrival > x.departure)
                                           && blocks.Any(b => (x.departure < b.End && x.departure > b.Start) && x.departure < x.arrival)).Sum
                                           (x => (x.arrival.TimeOfDay - x.departure.TimeOfDay).TotalHours);

所以 sumofbreakofblox 应该是:49 分钟,获取方式为:

1899-12-30 09:36:00.000 - 1899-12-30 09:21:00.000; (15)
1899-12-30 10:45:00.000 - 1899-12-30 10:34:00.000; (11)
1899-12-30 14:34:00.000 - 1899-12-30 14:24:00.000; (10) 
1899-12-30 16:27:00.000 - 1899-12-30 16:14:00.000; (13)

enter image description here

我有必要获取起始 block 和结束 block 之间时间段内的金额(出发 - 到达)

最佳答案

由于我误解了这个问题,这里有一个更新:

using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var blocks = new List<Block>
            {
                new Block
                {
                    End = new DateTime(1899, 12, 30, 11, 45, 0), Start = new DateTime(1899, 12, 30, 8, 30, 0)
                },
                new Block
                {
                    End = new DateTime(1899, 12, 30, 17, 0, 0), Start = new DateTime(1899, 12, 30, 13, 15, 0)
                }
            };

            var presences = new List<Presence>
            {
                new Presence
                {
                    Arrival = new DateTime(1899, 12, 30, 8, 3, 0),
                    Departure = new DateTime(1899, 12, 30, 9, 21, 0)
                },
                new Presence
                {
                    Arrival = new DateTime(1899, 12, 30, 9, 36, 0),
                    Departure = new DateTime(1899, 12, 30, 10, 34, 0)
                },
                new Presence
                {
                    Arrival = new DateTime(1899, 12, 30, 10, 45, 0),
                    Departure = new DateTime(1899, 12, 30, 12, 5, 0)
                },
                new Presence
                {
                    Arrival = new DateTime(1899, 12, 30, 13, 3, 0),
                    Departure = new DateTime(1899, 12, 30, 14, 24, 0)
                },
                new Presence
                {
                    Arrival = new DateTime(1899, 12, 30, 14, 34, 0),
                    Departure = new DateTime(1899, 12, 30, 16, 14, 0)
                },
                new Presence
                {
                    Arrival = new DateTime(1899, 12, 30, 16, 27, 0),
                    Departure = new DateTime(1899, 12, 30, 18, 2, 0)
                }
            };

            // group presence by blocks
            var group = new Dictionary<Block, List<Presence>>();
            foreach (var block in blocks)
            {
                group.Add(block, new List<Presence>());

                foreach (var presence in presences)
                {
                    if(presence.Departure >= block.Start && presence.Arrival <= block.End)
                        group[block].Add(presence);
                }
            }

            // calculate time per block
            foreach (var pair in group)
            {
                var block = pair.Key;
                var ps = pair.Value;

                for (int i = 0; i < ps.Count; i++)
                {
                    if (i + 1 < ps.Count)
                    {
                        Console.WriteLine($"{ps[i+1].Arrival} - {ps[i].Departure} = {(ps[i+1].Arrival - ps[i].Departure).Minutes}");
                    }
                }
            }

            Console.WriteLine("Press any key to exit!");
            Console.ReadKey();
        }
    }

    public class Block
    {
        public DateTime Start { get; set; }
        public DateTime End { get; set; }
    }

    public class Presence
    {
        public DateTime Arrival   { get; set; }
        public DateTime Departure { get; set; }
    }
}

enter image description here

关于c# - 计算 block 中的中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58872922/

相关文章:

c# - 为什么我的 TCP 应用程序在快速发送时会丢失一些数据包

c# - 阻塞线程是否会导致性能损失?

c# - LINQ to Entities 无法识别该方法,并且该方法无法转换为 store 表达式

c# - 使用C#在html文档中抓取JavaScript动态生成的数据

c# - 带数据绑定(bind)的 TreeView

c# - 比较两个数据表以确定其中一个而不是另一个中的行

c# - 面向初学者的 LINQ

c# - GUI 设计 : Hide/Show controls at run time

c# - 如何生成楼梯?

c# - 在偶数位和奇数位添加数字 (C#)