任何人都可以帮我计算发生的 block 之间的中断吗? 这是我的类(class),在我的列表中,我从 block 中获取开始和结束时间:
private class Block
{
public DateTime Start { get; set; }
public DateTime End { get; set; }
}
这就是列表中时间的样子
List<Block> blocks = new List<Block>();
[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)
我有必要获取起始 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; }
}
}
关于c# - 计算 block 中的中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58872922/