2009-11-20 3 views
2

voici mon problème. J'ai une liste de données, triées par dateStart:Recherché: Liste de données suivant certaines règles concernant les dates


index dateStart   dateEnd   value 
[0]  2009-11-01 04:20 2009-11-01 05:40 5 
[1]  2009-11-01 06:30 2009-11-01 08:42 10 
[2]  2009-11-01 07:43 2009-11-01 16:12 0 
[3]  2009-11-01 10:43 2009-11-01 14:34 -12 
[4]  2009-11-01 12:34 2009-11-01 12:42 3 

La sortie finale que je veux serait un sous-ensemble de cette liste, où dateStart et dateEnd de 2 articles différents ne seraient jamais en conflit.

Dans l'exemple actuel, je voudrais commencer à [0] et le conserver.
Pour [1], depuis son dateStart> [0] .dateEnd, je le garderais aussi.
Pour [2], depuis sa dateStart < = [1] .dateEnd, je le supprimerais.
Pour [3], depuis son dateStart> [2] .dateEnd, je le garderais.
Pour [4], depuis sa dateStart < = [3] .dateEnd, je le supprimerais.

et ainsi de suite.

Je voudrais utiliser LINQ (Lamda préféré) pour cela, si possible.
Sinon, je suppose qu'une norme pour la boucle ferait l'affaire.

Un autre moyen intéressant d'obtenir ma sortie finale serait de conserver toutes les données, mais ajouter un drapeau à chaque élément (bValid), qui indiquerait si les données doivent être prises ou non.

Merci! p.s. désolé pour la mise en forme, j'ai essayé de mon mieux (premier post ici)

Répondre

2

Je pense que vous avez une erreur dans un cas:

For [3], since its dateStart > [2].dateEnd, I would keep it. 

10:43 > 16:12 --> False 

Je pense que cela couvre ce que votre demande. Bien que je ne sais pas si vous voulez vérifier le EndDate des éléments jetés précédents ou le dernier élément qui a été accepté.

 IEnumerable<MyObj> res = l.Where((o,i) => { 
      if (i == 0) 
       return true; 
      else 
       return o.DateStart > l.ElementAt(i-1).DateEnd; 
     }); 

Cela ne sorties:

0 01-11-2009 4:20:00 01-11-2009 5:40:00 5 
1 01-11-2009 6:30:00 01-11-2009 8:42:00 10 

en raison du début EndDate haute 16h12.

(mise à jour)

Ok, j'ai vu vos commentaires. Cela change totalement les choses. Essayez ceci:

static IEnumerable<MyObj> MyFilter(IEnumerable<MyObj> input) 
    { 
     MyObj aux = input.First(); 
     yield return aux; 
     foreach (var o in input.Skip(1)) 
     { 
      if (o.DateStart > aux.DateEnd) 
      { 
       aux = o; 
       yield return aux; 
      } 
     } 
    } 

Il produit:

0 01-11-2009 4:20:00 01-11-2009 5:40:00 5 
1 01-11-2009 6:30:00 01-11-2009 8:42:00 10 
3 01-11-2009 10:43:00 01-11-2009 14:34:00 -12 
+0

Salut et merci pour votre réponse! Vous avez repéré correctement, mais [3] devrait être conservé, parce que j'ai oublié d'expliquer un autre concept dans ma question originale ... En fait, je prends [3] parce que son dateStart> [dernier élément que j'ai gardé] .dateEnd, qui est le [1] et son dateEt est 08:42 – ibiza

+0

donc ce n'est pas toujours un contrôle sur l'élément avant (index - 1), mais plutôt sur le dernier élément que j'ai gardé ... – ibiza

+0

@ibiza, S'il vous plaît voir ma réponse mise à jour. –

Questions connexes