.indexOf para resultados múltiples

Digamos que tengo un texto y quiero ubicar las posiciones de cada coma. La cadena, una versión más corta, se vería así:

string s = "A lot, of text, with commas, here and,there"; 

Idealmente, usaría algo como:

 int[] i = s.indexOf(','); 

pero como indexOf solo devuelve la primera coma, en su lugar hago:

 List list = new List(); for (int i = 0; i < s.Length; i++) { if (s[i] == ',') list.Add(i); } 

¿Hay una forma alternativa, más optimizada de hacer esto?

Podría utilizar el método Regex.Matches (cadena, cadena) . Esto devolverá un MatchCollection y luego podrá determinar el Match.Index. MSDN tiene un buen ejemplo,

utilizando el sistema; utilizando System.Text.RegularExpressions;

 public class Example { public static void Main() { string pattern = @"\b\w+es\b"; string sentence = "Who writes these notes?"; foreach (Match match in Regex.Matches(sentence, pattern)) Console.WriteLine("Found '{0}' at position {1}", match.Value, match.Index); } } // The example displays the following output: // Found 'writes' at position 4 // Found 'notes' at position 17 

Aquí tengo una extensión para eso:

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

para que puedas usar

 s.AllIndexesOf(","); 

IndexOf también le permite agregar otro parámetro para dónde comenzar a buscar . Puede configurar ese parámetro para que sea la última ubicación de coma conocida +1. Por ejemplo:

 string s = "A lot, of text, with commas, here and, there"; int loc = s.IndexOf(','); while (loc != -1) { Console.WriteLine(loc); loc = s.IndexOf(',', loc + 1); } 

Podría usar la sobrecarga del método IndexOf que también toma un índice de inicio para obtener la siguiente coma, pero aún así tendría que hacer eso en un bucle, y funcionaría de manera muy parecida al código que tiene.

Podría usar una expresión regular para encontrar todas las comas, pero eso produce bastante sobrecarga, por lo que no está más optimizado que lo que tiene.

Podría escribir una consulta LINQ para hacerlo de una manera diferente, pero eso también tiene algunos gastos generales, por lo que no está más optimizado que lo que tiene.

Por lo tanto, hay muchas formas alternativas, pero no de ninguna manera que esté más optimizada.