Możesz również napisać ogólną metodę rozszerzenia, która działa dla każdego Enumerable<T>:
///<summary>Finds the index of the first item matching an expression in an enumerable.</summary>///<param name="items">The enumerable to search.</param>///<param name="predicate">The expression to test the items against.</param>///<returns>The index of the first matching item, or -1 if no items match.</returns>publicstaticintFindIndex<T>(thisIEnumerable<T> items,Func<T,bool> predicate){if(items ==null)thrownewArgumentNullException("items");if(predicate ==null)thrownewArgumentNullException("predicate");int retVal =0;foreach(var item in items){if(predicate(item))return retVal;
retVal++;}return-1;}
Możesz również użyć LINQ:
int keyIndex = words
.Select((v, i)=>new{Word= v,Index= i}).FirstOrDefault(x => x.Word.IsKey)?.Index??-1;
+1, ale co jeśli przedmiot nie istnieje? otrzymamy 0, ale indeks to -1
Arsen Mkrtchyan
@ArsenMkrtchyan Jeśli pozycja nie istnieje, zwraca to słowa.Długość
Jim Balter
@ArsenMkrtchyan Napisałeś "dostaniemy 0" ... to było złe. Napisałeś „ale indeks to -1”… to też jest błędne. -1 jest częstym wskaźnikiem niepowodzenia, ale nie jedynym możliwym. Każda wartość spoza 0..words.Length-1 będzie wystarczająca.
Jim Balter,
1
@JimBalter, mam na myśli, że jeśli przedmiot nie istnieje, wyrażenie zwróci 0, co jest w nim nie tak? Zgadzam się, że -1 jest powszechnym wskaźnikiem, ale zgadzam się, że jest oczywiste, że 99% przypadków -1 jest wartością oczekiwaną, gdy pozycja nie istnieje. co najmniej 0 jest błędne, gdy przedmiot nie istnieje
Arsen Mkrtchyan
7
Jeśli chcesz znaleźć słowo, którego możesz użyć
var word = words.Where(item => item.IsKey).First();
Daje to pierwszy element, dla którego IsKey ma wartość true (jeśli może nie być, możesz chcieć użyć .FirstOrDefault()
Aby uzyskać zarówno element, jak i indeks, możesz użyć
KeyValuePair<WordType,int> word = words.Select((item, index)=>newKeyValuePair<WordType,int>(item, index)).Where(item => item.Key.IsKey).First();
Wydaje się to bardzo słabym rozwiązaniem w porównaniu z odpowiedziami Grizzly'ego i masenkablast. masenkablast odpowiada na pierwotne pytanie, a Grizzly podaje lepsze rozwiązanie do znalezienia tego słowa, ponieważ jego ostateczne „var” będzie właściwym słowem, a nie IEnumerable <TSource>, które zawiera 1 słowo.
James,
2
Właśnie opublikowałem moją implementację metody rozszerzenia IndexWhere () (z testami jednostkowymi):
Odpowiedzi:
To faktycznie daje indeks w postaci liczby całkowitej, a nie obiekt, niezależnie od tego, jaką klasę niestandardową utworzyłeś
źródło
System.Linq
domyślnie przekształcone w metodę rozszerzającą ? Tam jest wszystko inne takie jak to!W przypadku tablic możesz użyć
Array.FindIndex<T>
:W przypadku list, których możesz użyć
List<T>.FindIndex
:Możesz również napisać ogólną metodę rozszerzenia, która działa dla każdego
Enumerable<T>
:Możesz również użyć LINQ:
źródło
źródło
Jeśli chcesz znaleźć słowo, którego możesz użyć
Daje to pierwszy element, dla którego IsKey ma wartość true (jeśli może nie być, możesz chcieć użyć
.FirstOrDefault()
Aby uzyskać zarówno element, jak i indeks, możesz użyć
źródło
First
, wymaga predykatu, nie potrzebujeszWhere
.Spróbuj tego...
źródło
Właśnie opublikowałem moją implementację metody rozszerzenia IndexWhere () (z testami jednostkowymi):
http://snipplr.com/view/53625/linq-index-of-item--indexwhere/
Przykładowe użycie:
źródło
To rozwiązanie pomogło mi bardziej, od MSDN Microsoft :
query
to twojetoList()
zapytanie.źródło
źródło