49 votes

Recherche du premier index de l'élément qui correspond à une condition à l'aide de LINQ

var item = list.Where(t => somecondition);

J'aimerais pouvoir connaître l'index de l'élément qui a été renvoyé, en fait, dans mon cas, tout ce que je veux, c'est un index, afin que je puisse .Skip() dans la liste d'autant.

Existe-t-il un moyen de le faire dans un IEnumerable? Je détesterais utiliser un List<T> pour cela, mais cela a une méthode FindIndex()

61voto

Snafu Points 104

Si vous n'avez vraiment besoin que du premier index, comptez ceux qui ne correspondent pas :

 var index = list.TakeWhile(t => !someCondition).Count()

28voto

Chris Marinos Points 385

J'aurais besoin de plus de contexte, mais si vous obtenez juste un index pour pouvoir appeler .Skip , je vous recommanderais de jeter un œil à .SkipWhile .

Si vous avez vraiment besoin de l'index, je vous suggère d'écrire votre propre méthode d'extension .IndexOf

19voto

Manish Basantani Points 4347

Bien sûr, c'est possible en utilisant IEnumerable...

  public static class EnumerableExtension
    {

        public static int FirstIndexMatch<TItem>(this IEnumerable<TItem> items, Func<TItem,bool> matchCondition)
        {
            var index = 0;
            foreach (var item in items)
            {
                if(matchCondition.Invoke(item))
                {
                    return index;
                }
                index++;
            }
            return -1;
        }
    }

8voto

Frédéric Hamidi Points 123646

Vous pouvez d'abord projeter les éléments de la liste avec leurs index :

 var item = list.Select((item, index) => new { Item = item, Index = index })
               .Where(pair => SomeCondition(pair.Item))
               .Select(result => result.Index);

Prograide.com

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.

Powered by:

X