Si la cadena es corto, puede ser más eficiente para buscar la cadena de una vez y contar el número de veces que el personaje aparece, a continuación, asignar una matriz de ese tamaño y buscar la cadena por segunda vez, grabando los índices en la matriz. Esto omitirá cualquier reasignación de lista.
Lo que se reduce a cuánto tiempo es la cuerda y cuántas veces aparece el personaje. Si la cadena es larga y el personaje aparece pocas veces, buscarla una vez y agregar indicios a un List<int>
será más rápido. Si el personaje aparece muchas veces, entonces buscar la cadena dos veces (una para contar y una para llenar una matriz) puede ser más rápido. Exactamente donde está el punto de inflexión depende de muchos factores que no se pueden deducir de su pregunta.
Si es necesario buscar la cadena de múltiples caracteres diferentes y obtener una lista de índices para esos personajes por separado, puede ser más rápido para buscar a través de la cadena de una vez y construir un Dictionary<char, List<int>>
(o una List<List<int>>
utilizando las compensaciones de carácter de \0
como las indices en la matriz externa).
En última instancia, debe comparar su aplicación para encontrar cuellos de botella. A menudo, el código que creemos funcionará lentamente es en realidad muy rápido, y pasamos la mayor parte del tiempo bloqueando la entrada/salida o la entrada del usuario.
No hay manera más rápida de hacerlo para un carácter; sin embargo, si está buscando patrones más largos, existen diferentes algoritmos que le permiten omitir más de un carácter a la vez como el [algoritmo de búsqueda de cadenas de Boyer-Moore] (http://en.wikipedia.org/wiki/Boyer%) E2% 80% 93Moore_string_search_algorithm). –