上下文
所以我有一个在两个日期之间将处于活动状态的用户:
User.StartDate
User.EndDate
在此期间,用户可以选择要处理的任务。
Task.StartDate
Task.EndDate
注意:每个结束日期都可以为空。
如果在User上未定义EndDate,则该用户将始终处于活动状态,并且永远不会离开。
如果任务没有结束日期,则该任务将永远不会结束,并且始终对任务之后启动的用户可用。
尝试在C#中找到一种巧妙的方法来获取经过过滤的List<Task>
任务,用户处于活动状态,并且任务日期范围处于该活动时间段内。
我的解决方案
到目前为止,这是我想出的,有人会建议更好吗?
/// <summary>
/// Filter a list of Task so only tasks falling between dates will be returned.
/// If toDateTime is not defined, then it's considered open ended
/// </summary>
/// <param name="tasks"></param>
/// <param name="fromDateTime"></param>
/// <param name="toDateTime"></param>
/// <returns>A filtered list of tasks</returns>
public List<Task> FilterRatesOnDates(
List<Task> tasks,
DateTime fromDateTime,
DateTime? toDateTime)
{
tasks = tasks.FindAll(p =>
((p.ToDate.HasValue && fromDateTime <= p.ToDate)
|| !p.ToDate.HasValue)
&&
((toDateTime.HasValue && toDateTime >= p.FromDate)
|| !toDateTime.HasValue)
);
return tasks;
}
答案 0 :(得分:1)
我最近遇到了类似的问题,并被介绍给Fowler's Range。尽管示例不在C#中,但它们很容易翻译。这是我的:
public interface IRange<T>
{
T Start { get; }
T End { get; }
bool Includes(T value);
bool Includes(IRange<T> range);
}
public class DateRange : IRange<DateTime>
{
public DateRange(DateTime start, DateTime end)
{
Start = start;
End = end;
}
public DateTime Start { get; private set; }
public DateTime End { get; private set; }
public bool Includes(DateTime value)
{
return (Start <= value) && (value <= End);
}
public bool Includes(IRange<DateTime> range)
{
return (Start <= range.Start) && (range.End <= End);
}
}
并按如下方式使用:
DateRange range = new DateRange(firstDate, secondDate);
bool inRange = range.Includes(dateToTest);
根据您的情况,检查两个任务的日期是否在要求的范围内。