Question: 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?

Answer: 
In .NET 2.0 :)

```
    static void Main(string[] args)
    {
        List<DateTime> dates = new List<DateTime>();
        dates.Add(new DateTime(2010, 01, 27));
        dates.Add(new DateTime(2010, 01, 30));
        dates.Add(new DateTime(2010, 01, 31));
        dates.Add(new DateTime(2010, 02, 01));

        DateTime startDate = new DateTime(2010, 01, 25);
        DateTime endDate = new DateTime(2010, 02, 02);

        List<DateTime> missingDates = new List<DateTime>(GetMissingDates(dates, startDate, endDate));

    }

    private static IEnumerable<DateTime> GetMissingDates(IList<DateTime> dates, DateTime startDate, DateTime endDate)
    {
        TimeSpan _timeStamp = endDate - startDate;
        DateTime _tempDateTime = startDate;
        IList<DateTime> _dateTimeRange = new List<DateTime>();
        IList<DateTime> _missingDates = new List<DateTime>();

        for (int i = 0; i <= _timeStamp.Days; i++)
        {
            _dateTimeRange.Add(_tempDateTime);
            _tempDateTime = _tempDateTime.AddDays(1);
        }

        foreach (DateTime dt in _dateTimeRange)
        {
            if (!dates.Contains(dt))
                yield return dt;
        }
    }

```
```
var dates = new List<DateTime>
                {
                    new DateTime( 2010, 01, 01 ), 
                    new DateTime( 2010, 01, 02 ), 
                    new DateTime( 2010, 01, 03 ), 
                    new DateTime( 2010, 01, 05 )
                };

var targetDate = new DateTime( 2010, 01, 01 );

var missingDates = new List<DateTime>();
while ( targetDate <= new DateTime( 2010, 01, 06 ) )
{
    if ( !dates.Contains( targetDate ) )
        missingDates.Add( targetDate );

    targetDate = targetDate.AddDays( 1 );
}

foreach ( var date in missingDates )
    Debug.WriteLine( date.ToString() );

```

If you were thinking of solving this is LINQ, I do not believe it is possible unless you also had a list of all dates between the min and max date. In SQL, this amounts to a calendar table that contains all dates across a given time period.

Here is a LINQ solution where I create the Calendar list I mentioned above and then query for missing dates:

```
var dates = new List<DateTime>
                {
                    new DateTime( 2010, 01, 01 ), 
                    new DateTime( 2010, 01, 02 ), 
                    new DateTime( 2010, 01, 03 ), 
                    new DateTime( 2010, 01, 05 )
                };
var calendar = new List<DateTime>();
var targetDate = new DateTime( 2010, 01, 01 );
while ( targetDate <= new DateTime( 2010, 01, 06 ) )
{
    calendar.Add( targetDate );
    targetDate = targetDate.AddDays( 1 );
}

var missingDates = ( from date in calendar
              where !dates.Contains( date )
              select date ).ToList();

foreach ( var date in missingDates )
    Debug.WriteLine( date.ToString() );

```