Как насчет этого? Итого я получаю 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));