我在C#中有一个列表
List<Dates>
public class Dates
{
public DateTime Start {get; set;}
public DateTime End {get; set;}
}
在列表中:
开始 - 结束
我想找到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)
但是没有工作...... 有什么帮助吗?
由于
答案 0 :(得分:1)
根据您的问题(以及其他答案不是您想要的),我推断您希望所有任何的日期与您正在寻找的范围重叠。
很难将所有案例都包含在一个简单的逻辑语句中。如果你颠倒它会容易得多。换句话说,让我们查找不重叠的日期,然后查看其他日期。
我们如何定义不重叠的范围。嗯,它可能是两件事之一:
这涵盖所有情况,假设startdate永远不会大于结束日期(您应该已经检查过了!)。
所以现在,我们颠倒逻辑:
如果不是太早,而且还不算太晚,那么它必须恰到好处。
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.Start
在startPeriod
之前或之后发生并不重要;因为可能正确。
但是,在这两种情况下,myDate.Start
始终小于endperiod
。这就是我们将myDate.Start
与endperiod
匹配的原因。
如果myDate.Start
不小于endPeriod
,则发生得太晚。
考虑myDate.End
和startperiod
,同样的逻辑也适用。如果你把它写下来,你会看到相同的模式。
注意我只详细说明了两个比较中的一个(因为它们的工作原理相同),但如果想要正确的输出,则必须同时使用。这些不能单独工作,因为它们都是不完整的评估(但它们一起完成)
答案 1 :(得分:0)
要查找列表中与<!doctype html>
到startToCheck
范围重叠的任何成员,只需查找包含任何一个成员的成员即可。
endToCheck
答案 2 :(得分:-1)
尝试使用DateTime.Compare
方法:
https://msdn.microsoft.com/en-us/library/system.datetime.compare(v=vs.95).aspx