Se la stringa è breve, può essere più efficiente per cercare la stringa volta e contare il numero di volte che il carattere viene visualizzato, quindi allocare un array di tali dimensioni e cerca la stringa una seconda volta, registrare gli indici nella matrice. Questo salterà qualsiasi riassegnazione di liste.
Quello che viene fuori è la durata della stringa e il numero di volte in cui il carattere appare. Se la stringa è lunga e il carattere appare poche volte, cercarlo una volta e aggiungere gli indici a List<int>
sarà più veloce. Se il personaggio appare molte volte, cercare la stringa due volte (una volta per contare e una volta per riempire un array) potrebbe essere più veloce. Esattamente dove il punto di svolta dipende da molti fattori che non possono essere dedotti dalla tua domanda.
Se avete bisogno di cercare la stringa di caratteri multipli diversi e ottenere un elenco di indici per quei personaggi a parte, può essere più veloce per la ricerca in stringa una volta e costruire un Dictionary<char, List<int>>
(o un List<List<int>>
utilizzando scostamenti di caratteri da \0
come gli indizi nell'array esterno).
In definitiva, è necessario eseguire il benchmark dell'applicazione per individuare i colli di bottiglia. Spesso il codice che pensiamo si esibirà lentamente è in realtà molto veloce, e passiamo la maggior parte del nostro tempo a bloccare l'I/O o l'input dell'utente.
Non c'è modo più veloce per farlo per un carattere; tuttavia, se stai cercando pattern più lunghi, esistono diversi algoritmi che ti permettono di saltare più di un personaggio alla volta come l'algoritmo [Boyer-Moore string search] (http://en.wikipedia.org/wiki/Boyer% E2% 80% 93Moore_string_search_algorithm). –