Фильтрация даты и до - PullRequest
0 голосов
/ 05 июля 2018

Context

Итак, у меня есть пользователь, который будет активен между двумя датами:

User.StartDate
User.EndDate

В течение этого времени будут задачи, над которыми пользователь может работать.

Task.StartDate
Task.EndDate

Примечание: Конечные даты в каждой из них обнуляются.

Если 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;
}

1 Ответ

0 голосов
/ 05 июля 2018

Недавно я столкнулся с подобной проблемой, и мне представили Диапазон Фаулера . Хотя примеры не на 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);

В вашем случае убедитесь, что обе даты задач находятся в необходимом диапазоне.

...