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);
}
Tu ne peux pas. Utilisez plutôt un pour
for(int i=0; i<list.Count-1; i++)
Compare(list[i], list[i+1]);
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;
}
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));
});
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;
}
}
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.
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();
}
}