时差总和,按每年的出行天数排序

卡布福克斯

所以我有所有这些旅行日期,从日期到日期。我想将所有旅行天数相加,然后按年份对它们进行排序。但是,如果一次旅行跨越两年,我的代码将达到错误的总和:-(

给定

From date   To date      Number of days
01.01.2001  01.02.2001   32
01.01.2002  01.02.2002   32
01.05.2002  01.08.2002   93
20.12.2002  01.03.2003   72
01.02.2009  01.02.2010   366
01.01.2013  02.02.2015   763

                   Sum   1358

我的代码产生了这一点。但是,这是一个错误:

Year    Total days
2001    32
2002    137
2003    60
2009    334
2010    32
2013    365
2014    398        <---- here is a case where my code is wrong

Sum     1358

代码

var dates = new Dictionary<int, int>();
var stays = GetStays();
var returnString = "Year, Total days<br><br>";
foreach (var stay in stays)
{
    var totalTravelDays = stay.ToDate.Value.AddDays(1) - stay.FromDate;

    var currentYear = stay.FromDate.Value.Year;
    var nextYear = stay.FromDate.Value.AddYears(1).Year;
    var nextYearDate = new DateTime(stay.FromDate.Value.Year, 1, 1).AddYears(1);

    var daysInThisYear = new TimeSpan?();
    var daysInNextYear = new TimeSpan?();

    if (stay.FromDate.Value.Year != stay.ToDate.Value.Year)
    {
        daysInThisYear = nextYearDate - stay.FromDate;
        daysInNextYear = totalTravelDays - daysInThisYear;
    }
    else
    {
        daysInThisYear = totalTravelDays;
        daysInNextYear = new TimeSpan(0);
    }

    if (dates.ContainsKey(currentYear))
        dates[currentYear] += daysInThisYear.Value.Days;
    else
        dates[currentYear] = daysInThisYear.Value.Days;

    if (dates.ContainsKey(nextYear))
        dates[nextYear] += daysInNextYear.Value.Days;
    else
        dates[nextYear] = daysInNextYear.Value.Days;
}

感谢帮助:)

亚历克斯·菲利波维奇(Alex Filipovici)

假设var stays = List<Stay>();,您可以尝试以下操作:

var days = stays.SelectMany(s =>
        Enumerable
            .Range(0, (s.ToDate - s.FromDate).Days + 1)
            .Select(d => s.FromDate.AddDays(d)))
    .GroupBy(d => d.Year)
    .Select(s => new { Year = s.Key, TotalDays = s.Count() })
    .ToList();

days.ForEach(d =>
{
    Console.WriteLine("{0} {1}", d.Year, d.TotalDays);
});

上面的输出是:

2001 32
2002 137
2003 60
2009 334
2010 32
2013 365
2014 365
2015 33

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL:按总和排序

来自分类Dev

按周和年的总和/组天数

来自分类Dev

时差总和

来自分类Dev

每年超过R天数

来自分类Dev

按关联属性总和排序

来自分类Dev

MongoDB按子集的总和排序

来自分类Dev

SQL查询按总和排序

来自分类Dev

MongoDB按子集的总和排序

来自分类Dev

每年熊猫总和

来自分类Dev

R排序按组总和汇总

来自分类Dev

MySQL按子查询总和排序

来自分类Dev

如何按子文档的字段总和排序

来自分类Dev

按总和关系排序时分页

来自分类Dev

按对象中数组的总和排序

来自分类Dev

如何按剩余的月份和天数对列进行排序

来自分类Dev

按条件计算时差

来自分类Dev

Rails按数组总和对对象进行排序

来自分类Dev

如何通过外键按字段总和排序查询

来自分类Dev

按ggplot中的值总和对条形图进行排序

来自分类Dev

休眠如何使用order by子句按字段总和排序

来自分类Dev

按列总和对列进行排序,相邻的相同列

来自分类Dev

sql按子组总和数据排序

来自分类Dev

雄辩的:如何按其他表中列的总和排序

来自分类Dev

雄辩的:如何按其他表中列的总和排序

来自分类Dev

按对象属性的总和对一种对象进行排序

来自分类Dev

按行和列的总和排序熊猫数据透视表

来自分类Dev

休眠如何使用order by子句按字段总和排序

来自分类Dev

Rails按数组的总和对对象进行排序

来自分类Dev

MySQL按另一个表的总和排序