2009-04-20 12 views
6

Básicamente tienen que hacer String.IndexOf() y que necesitan para obtener variedad de índices de la cadena de origen.varios índices de cadena de origen

¿Hay manera fácil de obtener gran variedad de índices?

Antes de hacer esta pregunta he buscado en Google mucho, pero no han encontrado una solución fácil para resolver este sencillo problema.

+0

¿Pueden las instancias de la subcadena superponerse? – Andy

Respuesta

5
var indexs = "Prashant".MultipleIndex('a'); 

//Extension Method's Class 
    public static class Extensions 
    { 
     static int i = 0; 

     public static int[] MultipleIndex(this string StringValue, char chChar) 
     { 

      var indexs = from rgChar in StringValue 
         where rgChar == chChar && i != StringValue.IndexOf(rgChar, i + 1) 
         select new { Index = StringValue.IndexOf(rgChar, i + 1), Increament = (i = i + StringValue.IndexOf(rgChar)) }; 
      i = 0; 
      return indexs.Select(p => p.Index).ToArray<int>(); 
      } 
    } 
+0

¿Cómo lo haría, si necesitaba ser chChar cuerda? gracias. –

+0

Déjame comprobarlo ... –

15

¿Qué hay de este método de extensión:

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

Tenga en cuenta que cuando se busca "AA" en "XAAAY" este código será ahora sólo ceder 1.

Si realmente necesita una matriz, llame ToArray() en el resultado. (. Esto es suponiendo .NET 3.5 y por lo tanto el apoyo LINQ)

+0

Podría ajusta por favor, por lo que volvería a sólo 1 –

+0

en lugar de avanzar por 1, avanzar por la longitud de la aguja - utilizar la nomenclatura de Jon :) –

+0

Exactamente - pero puede ser un poco difícil de averiguar exactamente dónde para hacer eso :) He arreglado el código. –

6

que tendría que bucle, sospecho:

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

Usando una solución que utiliza expresiones regulares puede ser más confiable, usando el indexOf la función puede ser poco confiable. Encontrará todas las coincidencias e índices, sin coincidir con una frase exacta que puede conducir a resultados inesperados. Esta función resuelve eso al hacer uso de la biblioteca Regex.

public static IEnumerable<int> IndexesOf(string haystack, string needle) 
{ 
     Regex r = new Regex("\\b(" + needle + ")\\b"); 
     MatchCollection m = r.Matches(haystack); 

     return from Match o in m select o.Index; 
} 
Cuestiones relacionadas