.indexOf获得多个结果

时间:2011-07-28 20:43:38

标签: c# .net

假设我有一个文本,我想找到每个逗号的位置。字符串是一个较短的版本,如下所示:

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

理想情况下,我会使用类似的东西:

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

但由于indexOf只返回第一个逗号,我改为:

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

是否有另一种更优化的方法?

4 个答案:

答案 0 :(得分:10)

我在这里得到了一个扩展:

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

所以你可以使用

s.AllIndexesOf(",");

答案 1 :(得分:7)

您可以使用Regex.Matches(string, string)方法。这将返回MatchCollection,然后您可以确定Match.Index。 MSDN有一个很好的例子,

使用System; 使用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

答案 2 :(得分:4)

IndexOf also allows you to add another parameter for where to start looking。您可以将该参数设置为最后一个已知的逗号位置+1。例如:

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);
}

答案 3 :(得分:2)

您可以使用IndexOf方法的重载,该方法也会使用起始索引来获取以下逗号,但您仍然必须在循环中执行此操作,并且它的执行方式与你有的代码。

您可以使用正则表达式查找所有逗号,但这会产生相当大的开销,因此不会比您拥有的更优化。

您可以编写LINQ查询以不同的方式执行此操作,但这也有一些开销,因此它不会比您拥有的更优化。

因此,有许多替代方法,但不是任何更优化的方式。