web-dev-qa-db-fra.com

Comment puis-je accéder à la valeur suivante dans une collection à l'intérieur d'une boucle foreach en C #?

Je travaille en C # et avec un List<T> Trié de structures. J'essaie de parcourir le List et pour chaque itération, j'aimerais accéder au membre suivant de la liste. Y a-t-il un moyen de faire cela?

Exemple de pseudocode:

foreach (Member member in List)
{
    Compare(member, member.next);
}
32
Addie

Tu ne peux pas. Utilisez plutôt un pour

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

Vous pouvez simplement conserver 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;
}
18
Marc Gravell

Si l'on était si enclin, vous pourriez probablement aussi écrire une méthode d'extension pour cela ...

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

Usage:

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));
});
4
Nick

LINQ pourrait être votre ami ici. Cette approche fonctionnera avec tout ce qui est des collections IEnumerable <T>, pas seulement IList <T>, ce qui est très utile si votre collection ne se termine jamais ou est autrement calculée à 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;
    }
}
3
lesscode

Utilisez une boucle for régulière avec un index et comparez la liste [i] et la liste [i + 1]. (Mais assurez-vous de ne boucler que jusqu'à l'avant-dernier index.)

Ou, si vous voulez vraiment utiliser un foreach, vous pouvez conserver une référence Member au membre précédent et vérifier la prochaine fois. Mais je ne le recommanderais pas.

3
froadie
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();
            }
        }
1
Bappa Aditya Shee