Comment puis-je trouver l'index d'un élément dans une liste sans le parcourir?
Actuellement, cela ne semble pas très agréable - rechercher deux fois le même élément dans la liste, juste pour obtenir l'index:
var oProp = something;
int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));
int index
?Pour les types simples, vous pouvez utiliser "IndexOf":
la source
EDIT: Si vous utilisez uniquement un
List<>
et que vous avez seulement besoin de l'index,List.FindIndex
c'est en effet la meilleure approche. Je vais laisser cette réponse ici pour ceux qui ont besoin de quelque chose de différent (par exemple au-dessus de toutIEnumerable<>
).Utilisez la surcharge
Select
qui prend un index dans le prédicat, donc vous transformez votre liste en une paire (index, valeur):Ensuite:
Ou si vous ne voulez que l'index et que vous l'utilisez à plusieurs endroits, vous pouvez facilement écrire votre propre méthode d'extension qui était similaire
Where
, mais au lieu de renvoyer les éléments d'origine, elle a renvoyé les index de ces éléments qui correspondaient au prédicat.la source
Single()
opération parcourt cette séquence et trouve l'élément unique qui correspond au prédicat. Pour plus de détails, lisez ma série de blogs edulinq: codeblog.jonskeet.uk/category/edulinqSi vous ne souhaitez pas utiliser LINQ, alors:
de cette façon, vous répétez la liste une seule fois.
la source
FindIndex
par intérêt?Voici le code de List Of String:
Voici le code pour la liste des nombres entiers:
la source
Voici une méthode d'extension copier / coller pour IEnumerable
Prendre plaisir.
la source
Si quelqu'un se demande la
Array
version, ça se passe comme ceci:la source