Comment trouver l'index d'un élément dans une liste sans le parcourir en boucle?
Actuellement, cela n'a pas l'air bien - chercher dans la liste le même article deux fois, juste pour obtenir l'index:
var oProp = something;
int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));
Que diriez-vous de la méthode List.FindIndex :
int index = myList.FindIndex(a => a.Prop == oProp);
Cette méthode effectue une recherche linéaire. par conséquent, cette méthode est une opération O(n), où n est le nombre.
Pour les types simples, vous pouvez utiliser "IndexOf":
List<string> arr = new List<string>();
arr.Add("aaa");
arr.Add("bbb");
arr.Add("ccc");
int i = arr.IndexOf("bbb"); // RETURNS 1.
EDIT: Si vous uniquement utilisez un List<>
et vous uniquement a besoin de l'index, alors List.FindIndex
est bien la meilleure approche. Je laisserai cette réponse ici à ceux qui ont besoin de quelque chose de différent (par exemple, en plus de tout IEnumerable<>
).
Utilisez la surcharge de Select
qui prend un index dans le prédicat et transformez ainsi votre liste en une paire (index, valeur):
var pair = myList.Select((Value, Index) => new { Value, Index })
.Single(p => p.Value.Prop == oProp);
Ensuite:
Console.WriteLine("Index:{0}; Value: {1}", pair.Index, pair.Value);
Ou si vous seulement voulez l'index et que vous l'utilisez à plusieurs endroits, vous pouvez facilement écrire votre propre méthode d'extension qui ressemblait à Where
, mais au lieu de renvoyer les éléments d'origine, il a renvoyé les index des éléments correspondant au prédicat.
Si vous ne voulez pas utiliser LINQ, alors:
int index;
for (int i = 0; i < myList.Count; i++)
{
if (myList[i].Prop == oProp)
{
index = i;
break;
}
}
de cette façon, vous parcourez la liste une seule fois.
Voici le code pour List Of String:
int indexOfValue = myList.FindIndex(a => a.Contains("insert value from list"));
Voici le code pour la liste de nombre entier:
int indexOfNumber = myList.IndexOf(/*insert number from list*/);
Voici une méthode d'extension copier/coller pour IEnumerable
public static class EnumerableExtensions
{
/// <summary>
/// Searches for an element that matches the conditions defined by the specified predicate,
/// and returns the zero-based index of the first occurrence within the entire <see cref="IEnumerable{T}"/>.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list">The list.</param>
/// <param name="predicate">The predicate.</param>
/// <returns>
/// The zero-based index of the first occurrence of an element that matches the conditions defined by <paramref name="predicate"/>, if found; otherwise it'll throw.
/// </returns>
public static int FindIndex<T>(this IEnumerable<T> list, Func<T, bool> predicate)
{
var idx = list.Select((value, index) => new {value, index}).Where(x => predicate(x.value)).Select(x => x.index).First();
return idx;
}
}
Prendre plaisir.
Solution simple pour trouver un index pour toute valeur de chaîne dans la liste. Voici le code pour List Of String:
int indexOfValue = myList.FindIndex(a => a.Contains("//insert value from list"));
Solution simple pour trouver un index pour toute valeur Integer dans la liste. Voici le code pour la liste de nombre entier:
int indexOfNumber = myList.IndexOf(//insert number from list);