2008-11-15 11 views
1

Commençons par l'extrait suivant:Modification de l'article dans le foreach à travers la méthode

Foreach(Record item in RecordList){ 
    .. 
    item = UpdateRecord(item, 5); 
    .. 
} 

La fonction UpdateRecode change certains champs de l'élément et renvoie l'objet modifié. Dans ce cas, le compilateur lève une exception indiquant que l'élément ne peut pas être mis à jour dans une itération foreach.

Maintenant, la méthode UpdateRecord est modifiée de sorte qu'elle retourne vide et l'extrait ressemblerait à ceci:

Foreach(Record item in RecordList){ 
    .. 
    UpdateRecord(item, 5); 
    .. 
} 

Dans ce cas, l'élément sera mis à jour car enregistrement est un type de référence. Mais cela rend le code illisible.

Le projet sur lequel je travaille a beaucoup de boucles foreach avec presque le même code encore et encore, donc je voudrais créer des méthodes qui mettent à jour certaines parties des enregistrements. Y a-t-il une bonne façon de faire ça? Un qui rend le code plus lisible au lieu de le jeter encore plus loin?

Répondre

1

Si vous avez besoin de mettre à jour une collection, n'utilisez pas un modèle d'itérateur, comme vous l'avez dit, soit sujet à erreur, soit mauvais.

Je trouve que l'utilisation d'une boucle for avec un index un peu plus clair dans cette situation, comme c'est très évident ce que vous essayez de faire de cette façon.

+0

Merci, je pense que c'est la seule bonne façon d'aller dans ma situation. – Sorskoot

+1

Il n'y a absolument rien de mal à utiliser un modèle d'itérateur pour mettre à jour les éléments d'une collection. Vous ne voulez pas ajouter ou supprimer des éléments de la collection pendant l'itération, et c'est ce dont se plaint le compilateur. –

0

Avez-vous besoin de mettre à jour la même liste? Pourriez-vous renvoyer une nouvelle énumération (mise à jour) à la place?

foreach(Record item in RecordList){ 
    .. 
    yield return GetUpdatedRecord(item, 5); 
    .. 
} 
+0

Merci pour votre commentaire. Dans mon cas, le rendement n'est pas une option. Mais je le garderai à l'esprit, cela pourrait être utile ... – Sorskoot

1

Le compilateur se plaint que vous ne pouvez pas mettre à jour la collection , pas l'enregistrement. En faisant item = UpdateRecord, vous réattribuez l'élément de la variable itérateur. Je ne suis pas d'accord avec le fait que UpdateRecord (item, 5) soit illisible de quelque façon que ce soit - mais si cela vous fait vous sentir mieux, une méthode d'extension peut indiquer plus clairement que vous changez le contenu de l'item.

static void Update(this Record item, int value) { 
    // do logic 
} 

foreach (Record item in RecordList) { 
    item.Update(5); 
} 
Questions connexes