2009-06-12 8 views
0

Supposons que la classe Données est définie comme {DateTime TransactionDate, int ItemCount}. Je reçois un IEnumerable original contenant des TransactionDates et des ItemCounts dispersés et j'ai besoin d'écrire une méthode qui retourne une collection avec tous les jours remplis entre le minimum et le maximum de jours dans la collection originale.C# - remplissage de dates vides dans une collection

Par exemple, si je reçois:
12/5/2009 15,00
12/7/2009 10,00
12/10/2009 75,00

J'ai besoin de générer quelque chose comme ceci:
12/5/2009 15,00
12/6/2009 0,00
12/7/2009 10,00
12/8/2009 0,00
12/9/2009 0,00
12/10/2009 75,00

Vous me donnez une manière élégante de faire ceci avec C# 3.0?

J'ai une liste de toutes les dates entre les dates minimum et maximum. Donc, je suppose que tout ce que j'ai à faire est de "foreach" la collection d'intersection (allDates-existingDates) et d'insérer un nouvel élément pour chacun d'eux. Ai-je raison?

Merci

Répondre

2

Voici une méthode d'extension qui devrait faire l'affaire. C'est purement basé sur des itérateurs (IEnumerable<Data>), donc ça me semble une bonne approche.

public static IEnumerable<Data> FillIn(this IEnumerable<Data> original) 
{ 
    Data lastItem = null; 
    foreach (var item in original) 
    { 
     if (lastItem != null) 
     { 
      var fakeItem = new DateTime(lastItem.TransactionDate.Year, 
       lastItem.TransactionDate.Month, lastItem.TransactionDate.Day) 
       .AddDays(1); 
      while (fakeItem.TransactionDate != item.TransactionDate) 
      { 
       yield return fakeItem; 
       fakeItem.TransactionDate = fakeItem.TransactionDate.AddDays(1); 
      } 
     } 
     lastItem = item; 
     yield return item; 
    } 
} 

Data est simplement défini comme:

class Data 
{ 
    public DateTime TransactionDate; 
    public int ItemCount; 
} 
+0

Vous devriez considérer le fait que AddDays fonctionne sur les flottants. Pour cette raison, je l'ai trouvé ne pas être précis parfois (c'est-à-dire en ajoutant 23h59mXXs et pas un jour). – em70

0

Utilisez DateTime.AddDays de la première date et remplir les blancs en boucle de la première à la dernière date?

1

En supposant que votre collection est un dictionnaire (dates sont uniques et peuvent être utilisés en tant que clés), vous pouvez faire quelque chose lik ceci:

-1. Déterminez la première et la dernière date de votre collection source (si la collection est un triedDictionary, vous avez le premier et le dernier élément).

-2. Créez un IEnumerator qui peut parcourir toutes les dates entre une date de début et une date de fin données.

-3. Utilisez une structure foreach, en utilisant l'énumérateur et les dates de début et de fin obtenues. À chaque étape, vérifiez si la date actuelle est une clé dans la liste des sources, auquel cas vous la copiez dans la liste des résultats, sinon créez un nouvel élément de résultat avec la date actuelle et 0 pour le nombre d'éléments. Faites-moi savoir que cette preuve de concept est suffisante pour vous, sinon je vais essayer de construire un exemple.

Editer: Vous avez édité votre question, mentionnant que vous avez déjà la liste de toutes les dates entre le début et la fin de sorte que vous pouvez passer la 2ème étape. :)

0

En supposant que vous avez une liste contenant toutes les dates de la plage de date minimale à ce jour au maximum appelé alldates, vous pouvez effectuer les opérations suivantes:

var transactions = new List<Data>(originalData); 
transactions.AddRange(from dt in 
         alldates.Except 
          (
          from t in transactions 
          select t.TransactionDate 
         ) 
        select new Data() { TransactionDate = dt, ItemCount = 0 }); 

où les données sont définies comme suit:

class Data 
{ 
    public DateTime TransactionDate { get; set; } 
    public int ItemCount { get; set; } 
} 
Questions connexes