Obtenir l’index d’un article dans une liste en fonction de sa propriété

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) ...