web-dev-qa-db-fra.com

comment puis-je vérifier si une entité est le premier élément d'une boucle foreach

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.

34
Diskdrive

Vous pouvez le faire de plusieurs manières.

  1. Utilisez une boucle for à la place
  2. Définir un drapeau booléen
  3. Utilisez Linq pour obtenir le fichier list.First (), puis pour chaque fichier list.Skip
37
Jerod Houghtelling

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();
}
74

Quelque chose comme ça: 

bool first = true;

foreach(var item in items)
{
    if (first)
    {
        item.firstStuff();
        first = false;
    }
    item.otherStuff();
}
23
geofftnz

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));
15
Ani

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.

4
Corey Ogburn
bool first = true;
foreach(var foo in bar)
{
  if (first)
  {
    // do something to your first item
    first = false;
  }
  // do something else to the rest
}
2
Hamza

Ne peut penser à rien mais

var processedFirst = false;
foreach(var x in items) {
    if(!processedFirst) {
        ProcessFirst(x);
        processedFirst = true;
    }
2
Anton Gogolev

essaye celui-là

bool IsFirst = true;

foreach(DataRow dr in dt.Rows)
{
    if (IsFirst)
    {
        // do some thing
        IsFirst = false;
    }    
}
2
Azhar

A mon avis c'est le moyen le plus simple

foreach (var item in list)
{
    if((list.IndexOf(item) == 0)
    {
        // first
    }
    // others
}
1
Arif Furkan Deniz