Disons que j'ai un foreach
boucle.
Je dois faire quelque chose avec le premier objet de la boucle que je ne dois faire avec aucun des autres objets.
Comment puis-je vérifier si l'objet qui est actuellement dans la boucle est le premier objet.
Disons que j'ai un foreach
boucle.
Je dois faire quelque chose avec le premier objet de la boucle que je ne dois faire avec aucun des autres objets.
Comment puis-je vérifier si l'objet qui est actuellement dans la boucle est le premier objet.
J'aime la méthode Linq, mais sans le Skip(1), de cette façon vous pouvez également l'utiliser pour le dernier élément d'une liste et votre code reste propre imho :)
foreach(var item in items)
{
if (items.First()==item)
item.firstStuff();
else if (items.Last() == item)
item.lastStuff();
item.otherStuff();
}
Je n'aime pas cette approche car elle n'est pas strictement exacte. Si un élément est présent plus d'une fois, par exemple, et qu'il est également le premier ou le dernier élément, alors vous déclenchez la première ou la dernière condition plus d'une fois. Ou si certains éléments sont égaux, ils peuvent également déclencher la condition plus d'une fois.
Voici une solution performante :
using (var erator = enumerable.GetEnumerator())
{
if (erator.MoveNext())
{
DoActionOnFirst(erator.Current);
while (erator.MoveNext())
DoActionOnOther(erator.Current);
}
}
EDIT : Et en voici un en LINQ :
if (enumerable.Any())
{
DoActionOnFirst(enumerable.First());
foreach (var item in enumerable.Skip(1))
DoActionOnOther(item);
}
EDIT : Si les actions sur les éléments ont des signatures assignables à Func<TItem, TResult>
que vous pouvez faire :
enumerable.Select((item, index) => index == 0 ? GetResultFromFirstItem(item) : GetResultFromOtherItem(item));
Bien que cette méthode satisfasse techniquement aux exigences, elle est nettement moins lisible que l'utilisation d'un drapeau "premier" pour indiquer que d'autres ont posté.
Il s'agit plutôt d'une solution générale pour obtenir l'index avec chaque objet dans un tableau. Elle devrait fonctionner en testant si c'est la première.
List<String> entries = new List<string>();
entries.Add("zero");
entries.Add("one");
entries.Add("two");
Dictionary<int, String> numberedEntries = new Dictionary<int, string>();
int i = 0;
entries.ForEach(x => numberedEntries.Add(i++, x));
foreach (KeyValuePair<int, String> pair in numberedEntries) {
Console.WriteLine(pair.Key + ": " + pair.Value);
}
Dans cette configuration, la clé de la paire clé-valeur est l'index et la valeur est l'objet à cet index, dans mon exemple une chaîne de caractères, mais n'importe quel objet pourrait être placé là. Cela ajoute un peu de surcharge, mais peut être utilisé pour déterminer n'importe quel objet dans l'index de la liste si nécessaire.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.