web-dev-qa-db-fra.com

Comment obtenir l'index d'un élément d'une liste en une seule étape?

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));
164
Daniel Robinson

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.

377
Alex Filipovici

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.

69
Jon Skeet

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.

13
gzaxx
  1. 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"));
  1. 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*/);
5
user5245248

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.

1
Snæbjørn

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);
0
Bob