2013-06-23 12 views
11

In MyListList<Person> ci può essere un Person con la sua proprietà Name impostata su "ComTruise". Ho bisogno dell'indice di quello Person in quella lista. Non lo Person, è solo indice.Ottieni l'indice dell'elemento in un elenco data la sua proprietà

quello che sto facendo ora è:

string myName = ComTruise; 
int thatIndex = MyList.SkipWhile(p => p.Name != myName).Count(); 

Come posso fare meglio o utilizzare il metodo IndexOf per eseguire lo stesso compito?

+2

Questo è esattamente quello che fa IndexOf ... –

+0

È MyList la propria collezione o è Lista ? –

+0

Scusate, corretto. Come sarebbe la sintassi di IndexOf? – Sturm

risposta

12

quanto si tratta di un ObservableCollection, si può provare questo

int index = MyList.IndexOf(MyList.Where(p => p.Name == "ComTruise").FirstOrDefault()); 

tornerà -1 se "ComTruise" non esiste nella vostra collezione.

Come menzionato nei commenti, esegue due ricerche. Puoi ottimizzarlo con un ciclo for.

int index = -1; 
for(int i = 0; i < MyList.Count; i++) 
{ 
    //case insensitive search 
    if(String.Equals(MyList[i].Name, "ComTruise", StringComparison.OrdinalIgnoreCase)) 
    { 
     index = i; 
     break; 
    } 
} 
+0

Quindi, prima lo trovi e poi lo cerchi di nuovo? Questo è abbastanza inefficiente. – svick

+0

Hai ragione, se la lista è abbastanza grande, un ciclo For sarebbe meglio. Ho aggiornato la mia risposta. – keyboardP

+0

Perché hai modificato il confronto in modo che corrispondesse su sottostringhe? Ad esempio, il nome di "X-ComTruise" corrisponde alla "ricerca senza distinzione tra maiuscole e minuscole". – svick

0
var p = MyList.Where(p => p.Name == myName).FirstOrDefault(); 
int thatIndex = -1; 
if (p != null) 
{ 
    thatIndex = MyList.IndexOf(p); 
} 

if (p != -1) ... 
17

Si potrebbe utilizzare FindIndex

string myName = "ComTruise"; 
int myIndex = MyList.FindIndex(p => p.Name == myName); 

Nota: FindIndex restituisce -1 se nessun elemento che corrispondono alle condizioni definite dal predicato in dotazione può essere trovato nella lista.

+0

Arg, in realtà si tratta di una ObservableCollection e non di una lista, c'è qualcosa di equivalente? Pensavo fosse lo stesso in questo caso particolare. – Sturm

+0

Funziona molto bene se converto la mia ObservableCollection in una lista con il metodo .ToList(). Grazie! – Sturm

+0

Cracking, che certamente ti farà uscire, ma puoi farlo anche senza la conversione (alcune altre risposte hanno già mostrato come = D). – Chris

6

Potrebbe avere senso scrivere un metodo semplice estensione che fa questo:

public static int FindIndex<T>(
    this IEnumerable<T> collection, Func<T, bool> predicate) 
{ 
    int i = 0; 
    foreach (var item in collection) 
    { 
     if (predicate(item)) 
      return i; 
     i++; 
    } 
    return -1; 
} 
Problemi correlati