在具有开始/结束日期的对象列表中查找间隙

时间:2013-07-07 11:06:53

标签: c#

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

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; }
    }

我有一个项目开始和结束日期。所以我需要做的是返回一个List<> '差距',没有设定费率。

因此,如果我的项目开始日期为“01-JAN-2013”​​并且结束于“31-DEC-2013”​​,那么它们就是我的输入。

我需要查看列表,并输出没有付款率的开始/结束日期列表。

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

开始= 05-JAN-2013 端= 01-OCT-2013

开始= 15-OCT-2013 端= 25-DEC-2013

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

02-OCT-2013 14-OCT-2013

26-DEC-2013 31-DEC-2013

那段时间我无法确定比率。

这是用C#代码完成的。我正在使用实体框架,所以MAYBE的另一个选择是SQL Server中的一个视图,我可以使用...我有一个包含所有日期的日历表...但是,如果有人有一个常规,那么第一个奖项就是我可以在代码中使用它来解决这些问题。

1 个答案:

答案 0 :(得分: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);