2008-09-18 15 views
5

Tengo un IList que contiene elementos (padre primero), deben agregarse a un documento de diagrama en el orden inverso para que el padre se agregue último, dibujado en la parte superior para que sea lo primero que seleccione el padre usuario.¿Cómo iterar una colección .NET IList en el orden inverso?

¿Cuál es la mejor manera de hacerlo? Algo mejor/más elegante que lo que estoy haciendo actualmente que publico debajo ...

Respuesta

7

Si tiene .NET 3.5, ¿podría utilizar el reverso de LINQ?

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

(asumiendo que usted está hablando de la IList genérico)

+0

Estaba a punto de darme por vencido porque no pude encontrar el espacio de nombres System.Linq en intellisense. Estoy trabajando con NotifyCollectionChangedEventArgs que usa System.Collections.IList ... por lo que no puedo Reverse() de todos modos ... esto. votado arriba – Gishu

+0

siempre puede usar una (nueva lista (obEvtArgs.NewItems)). Invertir(), pero obtendrá un mayor uso de memoria y un menor rendimiento. –

+0

:) Para bucles son más familiares y legibles para mí al menos. Necesito familiarizarme con LINQ uno de estos días ... – Gishu

0

NewItems es mi lista aquí ... Esto es un poco torpe.

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

por qué no incluir esto en la pregunta? ¿Por qué publicar como respuesta? –

+0

De las preguntas frecuentes: ¿Puedo responder mi propia pregunta? ¿Qué pasa si no es realmente una pregunta? Lo mejor es enviar una respuesta, en lugar de contestar solo en la pregunta. Esto permite votar la respuesta y evaluarla justamente en comparación con las respuestas de otras personas. – digiguru

2

Sobre la base de los comentarios a Davy's answer y Gishu's original answer, se podría emitir su débilmente tipificado System.Collections.IList a una colección genérica utilizando el método System.Linq.Enumerable.Cast extensión:

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

Esto elimina el ruido, tanto de la for bucle inverso, y el as fundido para obtener un objeto inflexible de tipos desde el origen al coleccion.

0

No es necesario LINQ:

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