2008-09-18 6 views
5

J'ai un IList qui contient des éléments (parent d'abord), ils doivent être ajoutés à un document de diagramme dans l'ordre inverse de sorte que le parent est ajouté en dernier, dessiné sur le dessus de sorte qu'il est la première chose à être sélectionné par le utilisateur.Comment puis-je itérer une collection .Net IList dans l'ordre inverse?

Quelle est la meilleure façon de le faire? Quelque chose de meilleur/plus élégant que ce que je fais actuellement que je poste ci-dessous ..

Répondre

7

Si vous avez .NET 3.5, vous pouvez utiliser Reverse LINQ?

foreach(var item in obEvtArgs.NewItems.Reverse()) 
{ 
    ... 
} 

(En supposant que vous parlez du IList générique)

+0

J'étais sur le point d'abandonner parce que je ne pouvais pas trouver l'espace de noms System.Linq dans IntelliSense. Je travaille avec NotifyCollectionChangedEventArgs qui utilise un System.Collections.IList .. donc je ne peux pas inverser() anyways..thx. voté – Gishu

+0

vous pouvez toujours utiliser une (nouvelle liste (obEvtArgs.NewItems)). Reverse(), mais vous obtiendrez une utilisation de la mémoire plus élevée et des performances moindres. –

+0

:) Pour les boucles sont plus familier et lisible pour moi au moins. Besoin de se familiariser avec LINQ un de ces jours ... – Gishu

0

NewItems est ma liste ici ... C'est un peu maladroit cependant.

for(int iLooper = obEvtArgs.NewItems.Count-1; iLooper >= 0; iLooper--) 
      { 
       GoViewBoy.Document.Add(CreateNodeFor(obEvtArgs.NewItems[iLooper] as IMySpecificObject, obNextPos)); 
      } 
+1

pourquoi ne pas inclure dans la question? Pourquoi poster comme réponse? –

+0

De la FAQ: Puis-je répondre à ma propre question? Et si ce n'est pas vraiment une question? Il est préférable de soumettre une réponse plutôt que de simplement répondre à la question elle-même. Cela permet à la réponse d'être votée et évaluée équitablement par rapport aux réponses des autres. – digiguru

2

Sur la base des commentaires à Davy's answer et Gishu's original answer, vous pourriez lancer votre System.Collections.IList faiblement typé à une collection générique en utilisant la méthode d'extension System.Linq.Enumerable.Cast:

var reversedCollection = obEvtArgs.NewItems 
    .Cast<IMySpecificObject>() 
    .Reverse(); 

Cela supprime le bruit des deux la boucle for inverse, et la distribution as pour obtenir un objet fortement typé de l'origine al collection.

0

Vous n'avez pas besoin LINQ:

var reversed = new List<T>(original); // assuming original has type IList<T> 
reversed.Reverse(); 
foreach (T e in reversed) { 
    ... 
} 
Questions connexes