2010-03-08 30 views

Respuesta

40

No se puede. Utilice una para en lugar

for(int i=0; i<list.Count-1; i++) 
    Compare(list[i], list[i+1]); 
+9

Este código lanzará una excepción de índice fuera de límites para la lista [i + 1] en la última iteración del ciclo ... – froadie

+14

@froadie eso es lo que el -1 después del conteo es para – Bob

+0

@Bob - gracias, tiene razón, no vio que – froadie

3

Utilice un habitual para bucle con un índice, y la lista de comparación [i] y la lista de [i + 1]. (Pero asegúrese de solo bucle hasta el penúltimo índice).

O, si realmente desea utilizar un foreach, puede conservar una referencia de miembro para el miembro anterior y verificar la próxima vez. Pero no lo recomendaría.

16

Se podía mantener el valor anterior en su lugar:

T prev = default(T); 
bool first = true; 
foreach(T item in list) { 
    if(first) { 
     first = false; 
    } else { 
     Compare(prev, item); 
    } 
    prev = item; 
} 
+2

Esta solución es mejor que la mía si la lista es un ICollection o IEnumerable porque no se puede indexar los elementos sigle de la lista. – munissor

+0

¿Qué hay de T prev = T [0]? – Tom

2

LINQ pudo ser su amigo. Este enfoque funciona con cualquier cosa que sea IEnumerable <T>, no sólo IList <T> colecciones, que es muy útil si su colección nunca termina o se calcula de otro modo en la marcha:

class Program { 
    static void Main(string[] args) { 
     var list = new List<Int32> { 1, 2, 3, 4, 5 }; 
     foreach (var comparison in list.Zip(list.Skip(1), Compare)) { 
      Console.WriteLine(comparison); 
     } 
     Console.ReadKey(); 
    } 

    static Int32 Compare(Int32 first, Int32 second) { 
     return first - second; 
    } 
} 
2

Si uno fuera tan inclinado, que probablemente se podría escribir un método de extensión para esto también ...

public static void ForEachNext<T>(this IList<T> collection, Action<T, T> func) 
{ 
    for (int i = 0; i < collection.Count - 1; i++) 
     func(collection[i], collection[i + 1]); 
} 

Uso:

List<int> numList = new List<int> { 1, 3, 5, 7, 9, 11, 13, 15 }; 

numList.ForEachNext((first, second) => 
{ 
    Console.WriteLine(string.Format("{0}, {1}", first, second)); 
}); 
1
XmlNode root = xdoc.DocumentElement; 
XmlNodeList nodeList = root.SelectNodes("descendant::create-backup-sets/new-file-system-backup-set"); 

for (int j = 0; j < nodeList.Count; j++) 
{     
    for (int i = 0; i <= nodeList.Item(j).ChildNodes.Count - 1; i++) 
    { 
     if (nodeList.Item(j).ChildNodes[i].Name == "basic-set-info") 
     { 
      if (nodeList.Item(j).ChildNodes[i].Attributes["name"].Value != null) 
      { 
       // retrieve backup name 
       _bName = nodeList.Item(j).ChildNodes[i].Attributes["name"].Value.ToString(); 
      } 
     } 
+0

De esta manera puede iterar a través de la lista de nodos en lugar de usar el bucle foreach .. usar para bucle. En lugar de XmlNode individual, podemos usar el NodeList en sí –

Cuestiones relacionadas