Recherche de plusieurs index à partir de la chaîne source

Fondamentalement, je dois faire Ssortingng.IndexOf () et obtenir un tableau d’index à partir de la chaîne source.

Existe-t-il un moyen simple d’obtenir un tableau d’index?

Avant de poser cette question, j’ai beaucoup cherché sur Google, mais je n’ai pas trouvé de solution facile pour résoudre ce problème simple.

var indexs = "Prashant".MultipleIndex('a'); //Extension Method's Class public static class Extensions { static int i = 0; public static int[] MultipleIndex(this ssortingng SsortingngValue, char chChar) { var indexs = from rgChar in SsortingngValue where rgChar == chChar && i != SsortingngValue.IndexOf(rgChar, i + 1) select new { Index = SsortingngValue.IndexOf(rgChar, i + 1), Increament = (i = i + SsortingngValue.IndexOf(rgChar)) }; i = 0; return indexs.Select(p => p.Index).ToArray(); } } 

Que diriez-vous de cette méthode d’extension:

 public static IEnumerable IndexesOf(this ssortingng haystack, ssortingng needle) { int lastIndex = 0; while (true) { int index = haystack.IndexOf(needle, lastIndex); if (index == -1) { yield break; } yield return index; lastIndex = index + needle.Length; } } 

Notez que lorsque vous recherchez “AA” dans “XAAAY”, ce code ne produit plus que 1.

Si vous avez vraiment besoin d’un tableau, appelez ToArray() sur le résultat. (En supposant que .NET 3.5 et donc le support LINQ.)

Je suppose que vous devriez faire une boucle:

  int start = 0; ssortingng s = "abcdeafghaji"; int index; while ((index = s.IndexOf('a', start)) >= 0) { Console.WriteLine(index); start = index + 1; } 

L’utilisation d’une solution utilisant regex peut être plus fiable, tandis que la fonction indexOf peut ne pas être fiable. Il trouvera tous les résultats et les index, ne correspondant pas à une phrase exacte pouvant entraîner des résultats inattendus. Cette fonction résout ce problème en utilisant la bibliothèque Regex.

 public static IEnumerable IndexesOf(ssortingng haystack, ssortingng needle) { Regex r = new Regex("\\b(" + needle + ")\\b"); MatchCollection m = r.Matches(haystack); return from Match o in m select o.Index; }