Wie kann ich den Index eines Elements in einer Liste finden, ohne ihn zu durchlaufen?
Derzeit sieht das nicht besonders gut aus. Durchsuchen Sie die Liste zweimal nach demselben Element, um den Index zu erhalten:
var oProp = something;
int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));
int index
?Für einfache Typen können Sie "IndexOf" verwenden:
quelle
BEARBEITEN: Wenn Sie nur a verwenden
List<>
und nur den Index benötigen,List.FindIndex
ist dies in der Tat der beste Ansatz. Ich werde diese Antwort hier für diejenigen hinterlassen, die etwas anderes brauchen (z. B. obendreinIEnumerable<>
).Verwenden Sie die Überladung, für
Select
die ein Index im Prädikat verwendet wird, damit Sie Ihre Liste in ein (Index-, Wert-) Paar umwandeln:Dann:
Oder wenn Sie nur den Index möchten und diesen an mehreren Stellen verwenden, können Sie leicht eine eigene Erweiterungsmethode schreiben
Where
, die der folgenden entspricht. Statt jedoch die ursprünglichen Elemente zurückzugeben, werden die Indizes der Elemente zurückgegeben, die dem Prädikat entsprechen.quelle
Single()
durchläuft die Operation diese Sequenz und findet das einzelne Element, das dem Prädikat entspricht. Weitere Informationen finden Sie in meiner Edulinq-Blogserie: codeblog.jonskeet.uk/category/edulinqWenn Sie LINQ nicht verwenden möchten, gehen Sie wie folgt vor:
Auf diese Weise iterieren Sie die Liste nur einmal.
quelle
FindIndex
aus Interesse?Hier ist der Code für die Liste der Zeichenfolgen:
Hier ist der Code für die Liste der Ganzzahlen:
quelle
Hier ist eine kopier- / einfügefähige Erweiterungsmethode für IEnumerable
Genießen.
quelle
Wenn sich jemand für die
Array
Version wundert , geht es so:quelle