Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在列表中查找缺少的小时和分钟_C#_List_Datetime - Fatal编程技术网

C# 在列表中查找缺少的小时和分钟

C# 在列表中查找缺少的小时和分钟,c#,list,datetime,C#,List,Datetime,我想在列表中找到丢失的时间范围。 事件具有StartDate和EndDate(带时间)。我将在该列表中有相同的日期/月/年,因此每个对象中只有时间是不同的。假设每个事件都发生在2016年1月1日,那么时间是这样的: 开始时间:07:00结束时间:09:00 开始:09:00结束:11:30 开始时间:13:00结束时间:14:00 开始:18:15结束:20:00 我想在列表中找到空闲时间,所以我想得到类似的东西 开始时间:11:30结束时间:13:00 开始时间:14:00结束时间:18

我想在列表中找到丢失的时间范围。 事件具有StartDate和EndDate(带时间)。我将在该列表中有相同的日期/月/年,因此每个对象中只有时间是不同的。假设每个事件都发生在2016年1月1日,那么时间是这样的:

  • 开始时间:07:00结束时间:09:00
  • 开始:09:00结束:11:30
  • 开始时间:13:00结束时间:14:00
  • 开始:18:15结束:20:00
我想在列表中找到空闲时间,所以我想得到类似的东西

  • 开始时间:11:30结束时间:13:00
  • 开始时间:14:00结束时间:18:15

我怎样才能得到这样的东西呢?

试试下面的方法,这是假设时间是有序的

var today = DateTime.UtcNow;

var bookedTimes = new[]
{
    new DateRange(new DateTime(today.Year, today.Month, today.Day, 07, 00, 00),
        new DateTime(today.Year, today.Month, today.Day, 09, 00, 00)),
    new DateRange(new DateTime(today.Year, today.Month, today.Day, 09, 00, 00),
        new DateTime(today.Year, today.Month, today.Day, 11, 00, 00)),
    new DateRange(new DateTime(today.Year, today.Month, today.Day, 13, 00, 00),
        new DateTime(today.Year, today.Month, today.Day, 14, 00, 00)),
    new DateRange(new DateTime(today.Year, today.Month, today.Day, 18, 00, 00),
        new DateTime(today.Year, today.Month, today.Day, 20, 00, 00)),
};

var freeTimes = new List<DateRange>();
for (var i = 0; i < bookedTimes.Length -1; i++)
{
    var current = bookedTimes[i];
    var next = bookedTimes[i + 1];

    if (current.To != next.From)
    {
        var range = new DateRange(current.To, next.From);
        freeTimes.Add(range);
    }
}

foreach (var time in freeTimes)
{
    Console.WriteLine($"From {time.From.ToShortTimeString()}, to: {time.To.ToShortTimeString()}");
}

// Outputs:
// From 11:00, to: 13:00
// From 14:00, to: 18:00
var today=DateTime.UtcNow;
var bookedTimes=new[]
{
新的日期范围(新的日期时间(今天。年,今天。月,今天。日,07,00,00),
新的日期时间(今天。年,今天。月,今天。日,09,00,00)),
新的日期范围(新的日期时间(今天。年,今天。月,今天。日,09,00,00),
新的日期时间(今天。年,今天。月,今天。日,11,00,00)),
新日期范围(新日期时间(今天。年,今天。月,今天。日,13,00,00),
新的日期时间(今天。年,今天。月,今天。日,14,00,00)),
新日期范围(新日期时间(今天。年,今天。月,今天。日,18,00,00),
新的日期时间(今天。年,今天。月,今天。日,20,00,00)),
};
var freeTimes=新列表();
对于(变量i=0;i
您还可以使用Linq Zip方法将列表与其自身连接,创建一个间隔列表,然后过滤出开始和结束时间相同的条目

var gaplist =
      eventlist.Zip(eventlist.Skip(1), (ev1, ev2) => new MyEvent(ev1.End, ev1.Start))
                 .Where(gp => gp.Start != gp.End)
                 .ToList();

在我看来很直接。。如果列表中有2小时的差异,那么如果您发现一个值有1小时的差异,那么您应该知道缺少了什么。。开始编写一些代码,并至少向我们展示您自己尝试过的内容。。还要阅读DateTime结构中的
Hour
属性。。在TimeSpan上也做谷歌搜索好运气关于
00:00->07:00
20:00->24:00
?@我不需要找那个时间,因为活动可以在07:00或更晚时间开始,在20:00或更早时间结束。只需在列表中迭代,比较当前条目的结束时间和下一个条目的开始时间-如果它们不相同,则在空闲时间列表中创建一个新条目,从当前结束时间开始,在下一个开始时间结束。太好了。我以为有一个函数或方法可以在点后使用,但似乎它必须由我们自己编写。谢谢