Dans la List
MyList
List
il peut exister une Person
dont la propriété Name
définie sur “ComTruise”. J’ai besoin de l’index de cette Person
dans cette liste. Pas la Person
, juste son index.
Ce que je fais maintenant c’est:
ssortingng myName = ComTruise; int thatIndex = MyList.SkipWhile(p => p.Name != myName).Count();
Comment puis-je faire mieux ou utiliser la méthode IndexOf pour effectuer la même tâche?
Comme c’est un ObservableCollection
, vous pouvez essayer ceci
int index = MyList.IndexOf(MyList.Where(p => p.Name == "ComTruise").FirstOrDefault());
Il renverra -1
si “ComTruise” n’existe pas dans votre collection.
Comme mentionné dans les commentaires, cela effectue deux recherches. Vous pouvez l’optimiser avec une boucle 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; } }
Vous pouvez utiliser FindIndex
ssortingng myName = "ComTruise"; int myIndex = MyList.FindIndex(p => p.Name == myName);
Remarque: FindIndex renvoie -1 si aucun élément correspondant aux conditions définies par le prédicat fourni ne figure dans la liste.
Il pourrait être judicieux d’écrire une méthode d’extension simple qui effectue ceci:
public static int FindIndex( this IEnumerable collection, Func predicate) { int i = 0; foreach (var item in collection) { if (predicate(item)) return i; i++; } return -1; }
var p = MyList.Where(p => p.Name == myName).FirstOrDefault(); int thatIndex = -1; if (p != null) { thatIndex = MyList.IndexOf(p); } if (p != -1) ...