2010-03-08 7 views

Répondre

40

Vous ne pouvez pas. Utiliser une place pour

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

Ce code va lancer un index hors limites exception pour la liste [i + 1] sur la dernière itération de la boucle ... – froadie

+14

@froadie c'est ce que le -1 après Count est pour – Bob

+0

@Bob - merci, vous avez raison, n'a pas vu que – froadie

3

utiliser une base régulière pour la boucle avec un index et la liste comparative [i] et liste [i + 1]. Si vous voulez vraiment utiliser foreach, vous pouvez conserver une référence Member pour le membre précédent et vérifier la prochaine fois. Mais je ne le recommanderais pas.

16

Vous pouvez tout simplement garder la valeur précédente à la place:

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

Cette solution est meilleure que la mienne si la liste est ICollection ou IEnumerable car vous ne pouvez pas indexer les éléments sigle de la liste. – munissor

+0

Qu'en est-il de T prev = T [0]? – Tom

2

LINQ pourrait être votre ami ici. Cette approche fonctionnera avec tout ce qui est IEnumerable <T>, pas seulement IList <T> collections, ce qui est très utile si votre collection ne se termine jamais ou est autrement calculé sur la volée:

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 l'on si incliné, vous pourriez probablement écrire une méthode d'extension pour cela aussi ...

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]); 
} 

Utilisation:

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 cette façon, vous pouvez itérer à travers la nodelist à la place en utilisant foreach loop..use for loop. Au lieu de XmlNode individuel, nous pouvons utiliser le NodeList lui-même –

Questions connexes