1

我有一个对象列表,其中包含一个人收取的费率的开始和结束日期。

public class ProjectResourceCostDto
    {
        public int Id { get; set; }
        public int ProjectResourceId { get; set; }
        public DateTime StartDate { get; set; }
        public DateTime? EndDate { get; set; }
        public decimal Cost { get; set; }
        public bool Deleted { get; set; }
    }

我有一个项目的开始和结束日期。所以我需要做的是返回一个“差距”的列表<>,其中没有设置费率。

因此,如果我的项目开始日期为“2013 年 1 月 1 日”,结束日期为“2013 年 12 月 31 日”,那么它们就是我的输入。

我需要浏览列表,并输出没有支付率的开始/结束日期列表。

所以,如果我的对象列表有:

开始=2013 年 1 月 5 日结束=2013 年 10 月 1 日

开始=2013 年 10 月 15 日结束=2013 年 12 月 25 日

然后,我需要返回:01-JAN-2013 04-JAN-2013

2013 年 10 月 2 日 2013 年 10 月 14 日

2013 年 12 月 26 日 2013 年 12 月 31 日

这些是我无法确定费率的时期。

这将在 C# 代码中完成。我正在使用实体框架,所以可能另一个选项是 SQL Server 中的视图,我可以使用它......我确实有一个包含所有日期的日历表......但如果有人有例程,一等奖将是我可以在代码中使用它来计算这些时间段。

4

1 回答 1

0

您可以按日期(例如开始日期)对输入列表进行排序,然后在每次满足目标条件(即成本 = 0)时通过将日期添加到新列表来迭代它。在这里,您有一个示例代码,将所有相关日期写入gapsList

List<ProjectResourceCostDto> testList = new List<ProjectResourceCostDto>();
testList.Add(new ProjectResourceCostDto{Id = 1, ProjectResourceId = 1, StartDate = new DateTime(2001,2,1), EndDate = new DateTime(2002, 1,1), Cost = 1111, Deleted = false});
testList.Add(new ProjectResourceCostDto{Id = 2, ProjectResourceId = 2, StartDate = new DateTime(2003,1,1), EndDate = new DateTime(2004, 1,1), Cost = 0, Deleted = false});
testList.Add(new ProjectResourceCostDto { Id = 3, ProjectResourceId = 3, StartDate = new DateTime(2005, 1, 1), EndDate = new DateTime(2006, 1, 1), Cost = 999, Deleted = false });

DateTime firstDate = new DateTime(2001, 1, 1);
DateTime lastDate = new DateTime(2006, 2, 1);
List<DateTime> gapsList = new List<DateTime>();
gapsList.Add(firstDate);
testList = testList.OrderBy(n => n.StartDate).ToList();
foreach(ProjectResourceCostDto item in testList)
{
    if (item.Cost == 0)
    {
        gapsList.Add(item.StartDate);
        gapsList.Add((DateTime)item.EndDate);
    }
}
gapsList.Add(lastDate);
于 2013-07-07T11:44:44.370 回答