比较日期时间列表c#linq

时间:2017-05-15 19:45:29

标签: c# linq datetime

我在C#中有一个列表

List<Dates>
public class Dates
{
    public DateTime Start {get; set;}
    public DateTime End {get; set;}
}

在列表中:

开始 - 结束

  1. 2014-03-17 09:00:00 - 2014-03-17 10:00:00
  2. 2014-03-17 10:59:59 - 2014-03-17 11:44:59
  3. 我想找到nr2,除了startToCheck和endToCheck范围之外,其他所有内容。

    例如:

    startToCheck = 2014-03-17 11:00:00
    endToCheck = 2014-03-17 12:00:00
    

    显然,我的startToCheck在List nr2中,但找不到它。

    我试过

    if (Start <= startToCheck && End >= endToCheck)
    

    但是没有工作...... 有什么帮助吗?

    由于

3 个答案:

答案 0 :(得分:1)

根据您的问题(以及其他答案不是您想要的),我推断您希望所有任何的日期与您正在寻找的范围重叠。

很难将所有案例都包含在一个简单的逻辑语句中。如果你颠倒它会容易得多。换句话说,让我们查找重叠的日期,然后查看其他日期。

我们如何定义不重叠的范围。嗯,它可能是两件事之一:

  • 在您的搜索期开始之前,它已经结束。 (发生得太早)
  • 它仅在您的搜索期结束后才开始。 (发生得太晚了)

这涵盖所有情况,假设startdate永远不会大于结束日期(您应该已经检查过了!)。
所以现在,我们颠倒逻辑:

  • 在搜索期开始后<=>结束<=>过早发生了<= li>
  • AND 它开始之前您的搜索期结束(=没有发生太晚)

如果不是太早,而且还不算太晚,那么它必须恰到好处

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

    public List<Dates> FindOverlappingDates(DateTime beginPeriod, DateTime endPeriod)
    {
        var dateList = //fill in the list

        var dateRangesThatOverlap = datelist.Where(date =>
                 date.End > beginPeriod
                  && date.Start < endPeriod)

        return dateRangesThatOverlap.ToList();
    }

进一步说明

我知道将您的Startdate与期末相匹配是很奇怪的,反之亦然。但这是有道理的。如果我们考虑有效的开始日期,可以有两个选项:

  • 那些在您正在寻找的时间段内 >的人startPeriod&lt; myDate.Start&lt; endperiod
  • 那些在您正在寻找的时间段之前开始的人(myDate.Start&lt; startPeriod&lt; endperiod

如果你查看括号,你会看到一个意想不到的(但不可否认的)真理:myDate.StartstartPeriod之前或之后发生并不重要;因为可能正确。
但是,在这两种情况下,myDate.Start 始终小于endperiod。这就是我们将myDate.Startendperiod匹配的原因。

如果myDate.Start不小于endPeriod则发生得太晚

考虑myDate.Endstartperiod,同样的逻辑也适用。如果你把它写下来,你会看到相同的模式。

注意我只详细说明了两个比较中的一个(因为它们的工作原理相同),但如果想要正确的输出,则必须同时使用。这些不能单独工作,因为它们都是不完整的评估(但它们一起完成)

答案 1 :(得分:0)

要查找列表中与<!doctype html>startToCheck范围重叠的任何成员,只需查找包含任何一个成员的成员即可。

endToCheck

答案 2 :(得分:-1)