Jak znaleźć indeks elementu na liście bez przechodzenia przez niego?
Obecnie nie wygląda to zbyt ładnie - dwukrotne przeszukiwanie listy tego samego elementu, aby uzyskać indeks:
var oProp = something;
int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));
int index
?W przypadku prostych typów możesz użyć „IndexOf”:
źródło
EDIT: Jeśli tylko przy użyciu
List<>
i tylko trzeba indeks, wtedyList.FindIndex
jest rzeczywiście najlepszym rozwiązaniem. Pozostawię tę odpowiedź tutaj tym, którzy potrzebują czegoś innego (np. Na dowolnymIEnumerable<>
).Użyj przeciążenia,
Select
które pobiera indeks w predykacie, więc przekształcasz listę w parę (indeks, wartość):Następnie:
Lub jeśli chcesz tylko indeksu i używasz go w wielu miejscach, możesz łatwo napisać własną metodę rozszerzenia, która była podobna
Where
, ale zamiast zwracać oryginalne elementy, zwróciło indeksy tych elementów, które pasowały do predykatu.źródło
Single()
operacja iteruje tę sekwencję i znajduje pojedynczy element, który pasuje do predykatu. Aby uzyskać więcej informacji, przeczytaj moją serię blogów edulinqJeśli nie chcesz używać LINQ, to:
w ten sposób iterujesz listę tylko raz.
źródło
FindIndex
nie interesuje?Oto kod dla listy ciągów:
Oto kod dla listy liczb całkowitych:
źródło
Oto metoda rozszerzenia do kopiowania / wklejania dla IEnumerable
Cieszyć się.
źródło
Jeśli ktoś zastanawia się nad
Array
wersją, wygląda to tak:źródło