it-swarm.com.de

Wie erhält man den Index eines Elements in einer Liste in einem einzigen Schritt?

Wie finde ich den Index eines Elements in einer Liste, ohne ihn zu durchlaufen?

Derzeit sieht das nicht besonders gut aus. Sie durchsuchen die Liste zweimal nach demselben Artikel, um den Index zu erhalten:

var oProp = something;

int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));
164
Daniel Robinson

Wie wäre es mit der List.FindIndex-Methode :

int index = myList.FindIndex(a => a.Prop == oProp);

Diese Methode führt eine lineare Suche durch. Daher ist diese Methode eine O(n) -Operation, wobei n Count ist.

377
Alex Filipovici

Für einfache Typen können Sie "IndexOf" verwenden:

List<string> arr = new List<string>();
arr.Add("aaa");
arr.Add("bbb");
arr.Add("ccc");
int i = arr.IndexOf("bbb"); // RETURNS 1.

BEARBEITEN: Wenn Sie nur einen List<> verwenden und nur den Index benötigen, dann ist List.FindIndex in der Tat der beste Ansatz. Ich werde diese Antwort hier für diejenigen hinterlassen, die etwas anderes benötigen (z. B. auf jeden IEnumerable<>).

Verwenden Sie die Überladung von Select, die einen Index im Prädikat annimmt, damit Sie Ihre Liste in ein (Index-, Wert-) Paar umwandeln:

var pair = myList.Select((Value, Index) => new { Value, Index })
                 .Single(p => p.Value.Prop == oProp);

Dann:

Console.WriteLine("Index:{0}; Value: {1}", pair.Index, pair.Value);

Oder wenn Sie nur den Index möchten und Sie diesen an mehreren Stellen verwenden, können Sie leicht Ihre eigene Erweiterungsmethode schreiben, die der von Where gleicht, aber statt der ursprünglichen Elemente diese zurückgibt Gibt die Indizes der Elemente zurück, die mit dem Prädikat übereinstimmen.

69
Jon Skeet

Wenn Sie LINQ nicht verwenden möchten, gehen Sie wie folgt vor:

int index;
for (int i = 0; i < myList.Count; i++)
{
    if (myList[i].Prop == oProp)
    {
       index = i;
       break;
    }
}

auf diese Weise durchlaufen Sie die Liste nur einmal.

13
gzaxx
  1. Einfache Lösung, um einen Index für einen beliebigen Zeichenfolgenwert in der Liste zu finden.

Hier ist der Code für List Of String:

int indexOfValue = myList.FindIndex(a => a.Contains("insert value from list"));
  1. Einfache Lösung, um einen Index für einen beliebigen Integer-Wert in der Liste zu finden.

Hier ist der Code für die Liste der Ganzzahlen:

    int indexOfNumber = myList.IndexOf(/*insert number from list*/);
5
user5245248

Hier ist eine Erweiterungsmethode zum Kopieren/Einfügen für 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;
    }
}

Genießen.

1
Snæbjørn

Einfache Lösung, um einen Index für einen beliebigen Zeichenfolgenwert in der Liste zu finden. Hier ist der Code für List Of String:

int indexOfValue = myList.FindIndex(a => a.Contains("//insert value from list"));

Einfache Lösung, um einen Index für einen beliebigen Integer-Wert in der Liste zu finden. Hier ist der Code für die Liste der Ganzzahlen:

int indexOfNumber = myList.IndexOf(//insert number from list);
0
Bob