Un moyen plus efficace d’obtenir tous les index d’un caractère dans une chaîne

Au lieu de parcourir en boucle chaque caractère pour voir si c’est celui que vous voulez, ajoutez ensuite votre index à une liste comme ceci:

var foundIndexes = new List(); for (int i = 0; i < myStr.Length; i++) { if (myStr[i] == 'a') foundIndexes.Add(i); } 

Vous pouvez utiliser Ssortingng.IndexOf , voir exemple ci-dessous:

  ssortingng s = "abcabcabcabcabc"; var foundIndexes = new List(); long t1 = DateTime.Now.Ticks; for (int i = s.IndexOf('a'); i > -1; i = s.IndexOf('a', i + 1)) { // for loop end when i=-1 ('a' not found) foundIndexes.Add(i); } long t2 = DateTime.Now.Ticks - t1; // read this value to see the run time 

J’utilise la méthode d’extension suivante pour yield tous les résultats:

 public static IEnumerable AllIndexesOf(this ssortingng str, ssortingng searchssortingng) { int minIndex = str.IndexOf(searchssortingng); while (minIndex != -1) { yield return minIndex; minIndex = str.IndexOf(searchssortingng, minIndex + searchssortingng.Length); } } 

usage:

 IEnumerable result = "foobar".AllIndexesOf("o"); // [1,2] 

Que diriez-vous

 ssortingng xx = "The quick brown fox jumps over the lazy dog"; char search = 'f'; var result = xx.Select((b, i) => b.Equals(search) ? i : -1).Where(i => i != -1); 

Si la chaîne est courte, il peut être plus efficace de rechercher la chaîne une fois et de compter le nombre de fois que le caractère apparaît, puis d’allouer un tableau de cette taille et de rechercher la chaîne une seconde fois, en enregistrant les index dans le tableau. Cela évitera toute réallocation de liste.

Ce qui revient à déterminer la longueur de la chaîne et le nombre de fois où le caractère apparaît. Si la chaîne est longue et que le caractère apparaît plusieurs fois, une recherche unique et l’ajout d’indices à une List seront plus rapides. Si le caractère apparaît plusieurs fois, la recherche de la chaîne deux fois (une fois pour compter et une fois pour remplir un tableau) peut être plus rapide. Le sharepoint basculement dépend de nombreux facteurs qui ne peuvent pas être déduits de votre question.

Si vous devez rechercher plusieurs caractères différents dans la chaîne et obtenir une liste d’index pour ces caractères séparément, il peut être plus rapide de rechercher dans la chaîne une fois et de créer un Dictionary> (ou une List> utilisant les décalages de caractère à partir de \0 comme indicateurs dans le tableau extérieur).

Enfin, vous devez parsingr votre application pour rechercher les goulots d’étranglement. Nous pensons que le code à exécuter lentement est en fait très rapide et que nous passons le plus clair de notre temps à bloquer les entrées / sorties ou les entrées utilisateur.

L’itération brute est toujours meilleure et optimisée.

À moins que ce ne soit une tâche un peu complexe, vous n’avez jamais vraiment besoin de chercher une solution mieux optimisée …

Je suggère donc de continuer avec:

 var foundIndexes = new List(); for (int i = 0; i < myStr.Length; i++) if (myStr[i] == 'a') foundIndexes.Add(i);