Trouver des premier indice de l'élément qui correspond à une condition à l'aide de LINQ
var item = list.Where(t => somecondition);
J'aimerais être capable de trouver l'indice de l'élément qui a été renvoyé, en fait, dans mon cas, tout ce que je veux est un indice, de sorte que je peux .Skip() dans la liste en que beaucoup.
Est-il un moyen de le faire dans un IEnumerable? Je déteste utiliser un List<T>
pour cela, mais qui n'ont FindIndex()
méthode
Vous devez vous connecter pour publier un commentaire.
J'avais besoin de plus de contexte, mais si vous êtes tout simplement obtenir un indice, de sorte que vous pouvez appeler
.Skip
, je vous recommande de prendre un coup d'oeil à.SkipWhile
.Si vous ne vraiment besoin de l'index, je te suggère d'écrire votre propre
.IndexOf
méthode d'extension.SkipWhile
, parce que la recherche de l'index, puis en appelantSkip
énumère la requête deux foislist.Select().SkipWhile()
réponse à la fin de son post.SkipWhile
surcharge qui passe d'un index dans votre fonction de prédicat.Sûr, il est assez facile:
Qui retourne l'index s'il trouve quelque chose correspondant, ou -1 sinon. Les +1 et -1 est d'obtenir le comportement pour le cas où il n'y a pas de matches. Si tu savais qu'il y aurait toujours un match, il serait plus simple:
Si vous êtes heureux d'obtenir le reste de la liste à partir de ce point,
SkipWhile
est certainement votre ami, comme l'a dit Chris. Si vous voulez le reste de la liste et l'indice d'origine, c'est trop facile:Qui vous donnera une séquence de
{ value, index }
paires à partir de la première valeur correspondant àSomeCondition
.FirstOrDefault
ne vous permet pas de spécifier la valeur par défaut, hein?Si vous avez vraiment besoin juste le premier index de compter ceux qui ne correspondent pas:
Bien sûr son possible à l'aide de IEnumerable...
matchCondition.Invoke(item)
n'est pas nécessaire. Il vous suffit de fairematchCondition(item)
.Vous pouvez projeter les éléments de la liste avec leurs indices de première:
Si vous savez que vous avez une liste, par opposition à quelque chose comme un IEnumerbale ou un IQueryable ce pourrait être sympa ...
En référence à Jon Skeet réponse, vous pouvez utiliser DefaultIfEmpty() avant d'appeler FirstOrDefault sans addition et la soustraction de l'index.