Dis que j'ai une boucle foreach.
Je dois faire quelque chose avec le premier objet de la boucle que je n'ai à faire avec aucun des autres objets.
Comment puis-je vérifier si l'élément qui est actuellement dans la boucle est le premier objet.
Vous pouvez le faire de plusieurs manières.
J'aime la façon dont Linq, mais sans le saut (1), de cette façon, vous pouvez également l'utiliser pour le dernier élément de la 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();
}
Quelque chose comme ça:
bool first = true;
foreach(var item in items)
{
if (first)
{
item.firstStuff();
first = false;
}
item.otherStuff();
}
Voici une solution performante:
using (var erator = enumerable.GetEnumerator())
{
if (erator.MoveNext())
{
DoActionOnFirst(erator.Current);
while (erator.MoveNext())
DoActionOnOther(erator.Current);
}
}
EDIT: Et voici un LINQ:
if (enumerable.Any())
{
DoActionOnFirst(enumerable.First());
foreach (var item in enumerable.Skip(1))
DoActionOnOther(item);
}
EDIT: Si les signatures sur les actions sur les éléments sont assignables à Func<TItem, TResult>
, vous pouvez faire:
enumerable.Select((item, index) => index == 0 ? GetResultFromFirstItem(item) : GetResultFromOtherItem(item));
C'est plus une solution générale pour obtenir l'index avec chaque objet dans un tableau. Devrait travailler des tests si c'est le premier.
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 KeyValuePair est l'index et la valeur est l'objet à cet index, dans mon exemple une chaîne, mais tout objet peut être placé à cet emplacement. Il ajoute un peu de surcharge, mais peut être utilisé pour déterminer tout objet de l'index de la liste en cas de besoin.
bool first = true;
foreach(var foo in bar)
{
if (first)
{
// do something to your first item
first = false;
}
// do something else to the rest
}
Ne peut penser à rien mais
var processedFirst = false;
foreach(var x in items) {
if(!processedFirst) {
ProcessFirst(x);
processedFirst = true;
}
essaye celui-là
bool IsFirst = true;
foreach(DataRow dr in dt.Rows)
{
if (IsFirst)
{
// do some thing
IsFirst = false;
}
}
A mon avis c'est le moyen le plus simple
foreach (var item in list)
{
if((list.IndexOf(item) == 0)
{
// first
}
// others
}