Расчет количества дней диапазона дат c # - PullRequest
0 голосов
/ 08 ноября 2018

Обновлено

У меня есть список поездок в базе данных с различными датами начала и окончания, я хотел бы рассчитать сумму дней в каждой поездке, которая соответствует определенному диапазону.

Например:

Я хочу запросить количество дней для поездки в Бостон в следующем диапазоне:

RangeEnd - 27. ноябрь 2017 RangeStart - 1 ноября 2017 года

Вот мой обновленный код:

 var travel = new List<Travel>
 {
     new Travel("Egypt", new DateTime(2017, 8, 4), new DateTime(2017, 8, 24) ),
     new Travel("Spain", new DateTime(2017, 11, 1), new DateTime(2017, 12, 10) ),
     new Travel("Detroit", new DateTime(2017,9, 15), new DateTime(2017, 12, 20) ),
     new Travel("Boston", new DateTime(2017,10, 15), new DateTime(2017, 11, 20) ),

 };
 var rangeStart = new DateTime(2017, 11, 1);
 var rangeEnd = new DateTime(2017, 11, 27);
 var Trip = travel.Where(t => t.Country=="Boston");
 var sumOfDays= Trip.Sum(t => ????);

Ожидаемый результат для этого случая - 20 дней. Кто-нибудь может помочь?

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Спасибо @ Flydog57 за помощь в выяснении этого. я понял вашу идею вызова другой функции, и она работала с диапазоном.

 var travel = new List<Travel>
 {
     new Travel("Egypt", new DateTime(2017, 8, 4), new DateTime(2017, 8, 24) ),
     new Travel("Spain", new DateTime(2017, 11, 1), new DateTime(2017, 12, 10) ),
     new Travel("Detroit", new DateTime(2017,9, 15), new DateTime(2017, 12, 20) ),
     new Travel("Boston", new DateTime(2017,10, 15), new DateTime(2017, 11, 20) ),

 };
 var rangeStart = new DateTime(2017, 11, 1);
 var rangeEnd = new DateTime(2017, 11, 27);

 var Trip= travel.Where(s => s != null && s.City == "Boston");

 var sumOfDays= Trip.Sum(t => GetTravelDaysWithinRange(t.Start,t.End,rangeStart, rangeEnd));

И функция, которая вычисляет дни:

 public int GetTravelDaysWithinRange( DateTime start, DateTime end, DateTime rangeStart, DateTime rangeEnd)
 {
        int days = 0;
        while (start <= end)
        {
            if (start.Month>= rangeStart.Month && start.Month <= rangeEnd.Month && start.Year >= rangeStart.Year && start.Year <= rangeEnd.Year)
            {
                ++days;
            }
            start = start.AddDays(1);
        }
        return days;
  }

А точное значение 20 было приведено:)))))

0 голосов
/ 09 ноября 2018

Это можно сделать в 1 строку

var Trip = travel.Where(t => t.Country == "Boston").Select(x => (x.EndDate - x.StartDate).TotalDays).FirstOrDefault();

Вам нужно сначала или по умолчанию, если есть 0 результатов или больше, чем 1 recuslt

0 голосов
/ 08 ноября 2018

Как насчет этого? Итого я получаю 55, что я и ожидал:

Класс Путешествия:

public class Travel
{
    public Travel(string where, DateTime start, DateTime end)
    {
        Where = where;
        StartDate = start;
        EndDate = end;
    }
    public string Where { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

и затем потребляя его:

  var travel = new List<Travel>
  {
      new Travel("Egypt", new DateTime(2017, 8, 4), new DateTime(2017, 8, 24) ),
      new Travel("Spain", new DateTime(2017, 9, 1), new DateTime(2017, 10, 1) ),
      new Travel("Detroit", new DateTime(2017,9, 15), new DateTime(2017, 9, 20) ),

  };
  var sumOfTravelDays = travel.Sum(t => (t.EndDate - t.StartDate).Days);

Какую проблему вы видите?

Обновление

Добавьте эту функцию в класс Travel (либо в классе, либо в качестве метода расширения):

 public int GetTravelDaysWithinRange(DateTime rangeStart, DateTime rangeEnd)
 {
     //if everything is outside of the range to be considered, return 0
     if (rangeEnd < StartDate || rangeStart > EndDate)
     {
         return 0;
     }

     //Find the Max of StartDate and rangeStart 
     var startInRange = (rangeStart < StartDate) ? StartDate : rangeStart;
     //And the Min of EndDate and rangeEnd
     var endInRange = (rangeEnd > EndDate) ? EndDate : rangeEnd;
     //and get the number of days in-between (and then add 1 so Mon-Fri is 5 days, not 4)
     return (endInRange - startInRange).Days + 1;
 }

Теперь, когда я запускаю вариант моего исходного кода, он делает то, что я думаю, что вы хотите:

 var travel = new List<Travel>
 {
     new Travel("Egypt", new DateTime(2017, 8, 4), new DateTime(2017, 8, 24) ),
     new Travel("Spain", new DateTime(2017, 11, 1), new DateTime(2017, 12, 10) ),
     new Travel("Detroit", new DateTime(2017,9, 15), new DateTime(2017, 12, 20) ),
     new Travel("Boston", new DateTime(2017,10, 15), new DateTime(2017, 11, 20) ),

 };
 var rangeStart = new DateTime(2017, 11, 1);
 var rangeEnd = new DateTime(2017, 11, 27);
 var sumOfDates = travel.Sum(t => t.GetTravelDaysWithinRange(rangeStart, rangeEnd));
...