Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C根据日期列表计算日期范围_C#_Date - Fatal编程技术网

C# C根据日期列表计算日期范围

C# C根据日期列表计算日期范围,c#,date,C#,Date,给定一个可能无法排序的日期列表,我想建立一个日期范围列表- 例如,假设采用MM/DD格式 输入-5/1、5/5、5/6、5/15、5/7、5/8、5/19、5/20、5/23 输出- Date Range 1: 5/1 to 5/1 Date Range 2: 5/5 to 5/8 Date Range 3: 5/15 to 5/15 Date Range 4: 5/19 to 5/20 Date Range 5: 5/23 to 5/23 基本上,一个范围应该是连续的 您可以为所有日期创建一个

给定一个可能无法排序的日期列表,我想建立一个日期范围列表-

例如,假设采用MM/DD格式

输入-5/1、5/5、5/6、5/15、5/7、5/8、5/19、5/20、5/23

输出-

Date Range 1: 5/1 to 5/1 Date Range 2: 5/5 to 5/8 Date Range 3: 5/15 to 5/15 Date Range 4: 5/19 to 5/20 Date Range 5: 5/23 to 5/23 基本上,一个范围应该是连续的

您可以为所有日期创建一个日期时间列表(可能使用同一年),并对其进行排序

然后,很容易找到列表中是否存在一天和第二天。

您可以创建一个日期时间列表,可能使用同一年对所有日期时间进行排序

然后很容易通过使用找到列表中是否存在某一天和第二天

对日期进行排序 开始一个包含下一个开始日期的范围,它将是第一个日期 第二个有效日期是否为该范围内的下一个日期?如果是这样,继续前进。如果没有,请关闭当前范围并开始新的范围。 重复此操作,直到日期用完,此时关闭当前范围并完成。 对日期进行排序 开始一个包含下一个开始日期的范围,它将是第一个日期 第二个有效日期是否为该范围内的下一个日期?如果是这样,继续前进。如果没有,请关闭当前范围并开始新的范围。 重复此操作,直到日期用完,此时关闭当前范围并完成。
你能把你到目前为止想出的代码贴出来,告诉我们什么不起作用吗?闻起来像是作业。将其标记为这样,并添加您所做的工作以及您所提出的解决方案中存在的具体问题。您是如何从这些输入中获得这些范围的?看起来正确的答案会有一个rand。接下来的某个地方…你能发布你到目前为止想出的代码并告诉我们什么不起作用吗?闻起来像是家庭作业。将其标记为这样,并添加您所做的工作以及您所提出的解决方案中存在的具体问题。您是如何从这些输入中获得这些范围的?看起来正确的答案会有一个兰德。下一个在它的某个地方。。。
public class DateRange
{
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

[TestClass]
public class DateRangerTest
{

    private List<DateRange> GetDateRanges(List<DateTime> dates)
    {
        if (dates == null || !dates.Any()) return null;
        dates = dates.OrderBy(x => x.Date).ToList();

        var dateRangeList = new List<DateRange>();

        DateRange dateRange = null;
        for (var i = 0; i < dates.Count; i++)
        {
            if (dateRange == null)
            {
                dateRange = new DateRange { Start = dates[i] };
            }
            if (i == dates.Count - 1 || dates[i].Date.AddDays(1) != dates[i + 1].Date)
            {
                dateRange.End = dates[i].Date;
                dateRangeList.Add(dateRange);
                dateRange = null;
            }
        }
        return dateRangeList;
    }

    [TestMethod]
    public void GetDateRanges_MultiDateRangeTest()
    {
        var dates = new List<DateTime>
        {
            new DateTime(1999,5,1),
            new DateTime(1999,5,5),
            new DateTime(1999,5,6),
            new DateTime(1999,5,15),
            new DateTime(1999,5,7),
            new DateTime(1999,5,8),
            new DateTime(1999,5,19),
            new DateTime(1999,5,20),
            new DateTime(1999,5,23)
        };

        var dateRanges = GetDateRanges(dates);

        Assert.AreEqual(new DateTime(1999, 5, 1), dateRanges[0].Start);
        Assert.AreEqual(new DateTime(1999, 5, 1), dateRanges[0].End);

        Assert.AreEqual(new DateTime(1999, 5, 5), dateRanges[1].Start);
        Assert.AreEqual(new DateTime(1999, 5, 8), dateRanges[1].End);

        Assert.AreEqual(new DateTime(1999, 5, 15), dateRanges[2].Start);
        Assert.AreEqual(new DateTime(1999, 5, 15), dateRanges[2].End);

        Assert.AreEqual(new DateTime(1999, 5, 19), dateRanges[3].Start);
        Assert.AreEqual(new DateTime(1999, 5, 20), dateRanges[3].End);

        Assert.AreEqual(new DateTime(1999, 5, 23), dateRanges[4].Start);
        Assert.AreEqual(new DateTime(1999, 5, 23), dateRanges[4].End);
    }
}