J'essaie de trouver des dates manquantes entre deux variables DateTime pour une collection de DateTimes.
Par exemple. P>
2010-01-04 2010-01-06
5 Réponses :
Selon exactement ce que vous recherchez et la taille des ensembles de données. Un moyen simple serait de charger les dates dans une collection, puis utilisez une boucle simple. Je vais ajouter un échantillon de code ici dans une seconde. À l'aide de cet exemple, vous devez simplement charger des "existants" avec les valeurs appropriées, la liste "mangedates" aura vos résultats < / p> p>
Est-ce une bonne approche pour utiliser .Contient (..) là-bas? Faites correspondre l'ensemble de la matrice contre un élément d'une itération de lui-même. Je n'ai pas été comparé, mais j'irais pour un endroit où et compter les hits <1 ici.
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() );
Je peux penser à de nombreuses manières de la mettre en œuvre, par exemple: et vous pouvez mettre la fourche-gamme dans une méthode d'extension p> alors ce serait simplement p> mais peut-être que ce n'est pas une solution haute performance: -) P> P>
Thats similaires à ce que je pensais sauf en utilisant une boucle pour construire ma gamme. Je n'ai tout simplement pas aimé l'idée de construire une liste des jours à chaque fois que je dois le faire tranquille.
Ne devrait pas être aussi lent, puisque Enumeramble.Range est évalué paresseux IIRC. Je ne vois aucune solution propre autre que de créer une liste de dates, car la classe DateTime effectue toute la logique de traitement de la date nécessaire pour vous.
Parti avec cette solution. Le succès de la performance n'était pas aussi mauvais que je pensais que ce serait!
La méthode d'assistant évaluée paresseux aide à générer la liste des dates à comparer avec. Peut vouloir profil de performance cette méthode pour les grandes collections.
void Main()
{
var dates = new[] {new DateTime(2000,1,1), new DateTime(2000,1,5)};
DateHelper.Range(new DateTime(2000,1,1), new DateTime(2000,1,5)).Except(dates).Dump();
}
// Define other methods and classes here
public static class DateHelper {
public static IEnumerable<DateTime> Range(DateTime start, DateTime end) {
var days = end.Subtract(start).Days;
var next = start;
for(var i = 0; i<days; i++) {
next = next.AddDays(1);
yield return next;
}
}
}
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;
}
}