Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.1k views
in Technique[技术] by (71.8m points)

c# - Find missing dates for a given range

I'm trying to find missing dates between two DateTime variables for a collection of DateTimes.

For example.

Collection
2010-01-01
2010-01-02
2010-01-03
2010-01-05

DateRange
2010-01-01 -> 2010-01-06

would give me a List<DateTime> of

2010-01-04
2010-01-06

I can think of a few was of implementing this but nothing clean and simple

Any ideas?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I can think of a lot of ways of implementing this, e.g.:

DateTime[] col = { new DateTime(2010, 1, 1),
                   new DateTime(2010, 1, 2),
                   new DateTime(2010, 1, 3),
                   new DateTime(2010, 1, 5)};

var start = new DateTime(2010, 1, 1);
var end = new DateTime(2010, 1, 6);

var range = Enumerable.Range(0, (int)(end - start).TotalDays + 1)
                      .Select(i => start.AddDays(i));

var missing = range.Except(col);

And you could put the range-stuff into an Extension-Method

public static class extensions
{
    public static IEnumerable<DateTime> Range(this DateTime startDate, DateTime endDate)
    {
        return Enumerable.Range(0, (int)(endDate - startDate).TotalDays + 1)
                         .Select(i => startDate.AddDays(i));
    }
}

Then it would be simply

DateTime[] col = { new DateTime(2010, 1, 1),
                   new DateTime(2010, 1, 2),
                   new DateTime(2010, 1, 3),
                   new DateTime(2010, 1, 5)};

var start = new DateTime(2010, 1, 1);
var end = new DateTime(2010, 1, 6);
var missing = start.Range(end).Except(col);

But maybe this is not a high-performance-solution :-)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...