2010-07-26 3 views
2

J'ai une collection String qui est rempli avec les ID comme si ->Index actuel pour l'enlèvement dans la chaîne Collection

12345 
23456 
34567 

et ainsi de suite. Ce que je dois faire est à la demande de l'utilisateur, et quand certains paramètres sont rencontrés, parcourez cette liste, en commençant par le haut, et effectuez une méthode() en utilisant cet ID. En cas de succès, je voudrais le retirer de la liste et passer à autre chose.

Je n'ai pas, de manière embarrassante, travaillé auparavant avec une collection de cette manière. Quelqu'un peut me diriger dans la bonne direction. Les exemples semblent tous être de la variété Console.Writeline("");.

Ma base, ignorant, tentative ressemble à ceci ->

var driUps = Settings.Default.DRIUpdates.GetEnumerator(); 
     while (driUps.MoveNext()) 
     { 
      var wasSuccessfull = PerformDRIUpdate(driUps.Current); 
      if (wasSuccessfull) 
      { 
       driUps.Current.Remove(driUps.Current.IndexOf(driUps.Current)); 
      } 
     } 

La partie que je suis plus préoccupé par le Remove(); est-il pas une meilleure façon d'obtenir l'indice actuel? Tous les conseils, astuces, critiques, pointeurs, etc ... bienvenue. Merci!

Répondre

4

Vous avez tout à fait raison de vous préoccuper de l'élimination pendant le dénombrement. Que diriez-vous somethign comme ceci:

int idx = 0; 
while (idx < strCol.Count) 
{ 
    var wasSuccessful = PerformDRIUpdate(strCol[idx]); 
    if (wasSuccessful) 
     strCol.RemoveAt(idx); 
    else 
     ++idx; 
} 
+0

Cela évite également le problème d'invalider l'énumérateur lors du retrait d'un élément de la collection. +1 – TreDubZedd

+1

+1 pour fournir une solution qui n'utilise pas d'énumérateur, pour le problème "collection modifiée lors de l'énumération". Cela dépend de la taille de la collection, mais je fais généralement des boucles en arrière pour des raisons de performance afin d'éviter la reconstruction de la collection interne. –

+0

@chibacity: En faisant une boucle arrière, vous inverseriez la condition 'while', essentiellement? Et le 'idx = strCol.Count'? –

0

Itère un recenseur est mieux fait avec l'foreach(), il fait un GetEnumerator() et crée un bloc similaire sous les couvertures à ce que vous obtenez à, la syntaxe est :

foreach(ObjectType objectInstance in objectInstanceCollection) 
{ 
    do something to object instance; 
} 

pour vous,

List<DRIUpdate> updatesToRemove = new List<DRIUpdate>(); 
foreach(DRIUpdate driUpdate in Settings.Default.DRIUpdates) 
{ 
    if (PerformDRIUpdate(driUpdate)) 
    { 
     updatesToRemove.Add(driUpdate); 
    } 
} 

foreach(DRIUpdate driUpdate in updatesToRemove) 
{ 
    Settings.Default.DRIUpdates.Remove(driUpdate); 
} 
0

Si driUps est un IEnumerable<T>, essayez ceci:

driUps = driUps.Where(elem => !PerformDRIUpdate(elem)); 

Mise à jour:

Dans l'exemple, il semble que ce soit plus approprié:

Settings.Default.DRIUpdates = 
    Settings.Default.DRIUpdates.Where(elem => !PerformDRIUpdate(elem)); 

Pour List<T>, il est plus simple:

list.RemoveAll(PerformDRIUpdate); 
1

Comme le suggère n8wrl, using RemoveAt résout le problème d'essayer de retirer un article tout en énumérant la collection, mais pour de grands collectio La suppression d'éléments au premier plan peut entraîner des problèmes de performances lorsque la collection sous-jacente est reconstruite. Travaillez votre chemin à partir de la fin de la collection et supprimez les éléments de cette fin:

//Loop backwards, as removing from the beginning 
//causes underlying collection to be re-built 
int index = (strCol.Count - 1); 

while (index >= 0) 
{ 
    if (PerformDRIUpdate(strCol[index])) 
    { 
     strCol.RemoveAt(index); 
    } 

    --index; 
} 
+0

Merci, ce n'est pas vraiment un problème pour moi car cette liste ne sera jamais plus, disons 20 items, mais il est toujours bon de connaître une "meilleure pratique". Je souhaite seulement qu'il y ait eu la moitié des réponses que je pouvais attribuer.Quoi qu'il en soit, merci d'avoir pris le temps. –

+0

@Refracted Ce serait bien. Juste heureux de transmettre les connaissances sur :) –

Questions connexes