获取具有字符串中重复char的位置的数组

时间:2014-05-06 18:34:16

标签: c# regex string char comparison

输入是一个字符串和一个字符,即:

string stInput = "An string with multiple spaces";
char charInput = ' ';

输出应该是一个整数数组,即:

int[] output = CharPositions(stInput, charInput);
// output = {2, 9, 14, 23};

这是我的猜测:

int[] CharPositions(string stInput, char charInput)
{
    List<int> output = new List<int>();
    int i = stInput.IndexOf(charInput, 0);
    while(i > -1)
    {
        output.Add(i);
        i = stInput.IndexOf(charInput, i + 1);
    }
    output.Add(i);
    return output.ToArray();
}

有没有更有效率的方法呢?

5 个答案:

答案 0 :(得分:2)

它内部的IndexOf循环效率不会高得多。

IEnumerable<int> CharPositions(string input, char match)
{
    int i = input.IndexOf(match, 0);
    while(i > -1)
    {
        yield return i;
        i = input.IndexOf(match, i + 1);
    }
}

如果需要,您可以在上述方法的结果上调用.ToArray()

答案 1 :(得分:1)

您可以遍历字符串:

static IEnumerable<int> CharPositions(string input, char match)
{
    for (int i = 0; i < input.Length; i++)
        if (input[i] == match)
            yield return i;
}

答案 2 :(得分:1)

public static int[] IndicesOf(this string self, char match)
{
  if (string.IsNullOrEmpty(self))
    return new int[0];

  var indices = new List<int>();

  for (var i = 0; i < self.Length; i++)
  {
    if (self[i] == match)
      indices.Add(i);
  }

  return indices.ToArray();
}

答案 3 :(得分:1)

这应该这样做:

public int[] CharPositions(string input, char match)
{
    return Regex.Matches(input, Regex.Escape(match.ToString()))
               .Cast<Match>()
               .Select(m => m.Index)
               .ToArray();
}

答案 4 :(得分:1)

您可以使用LINQ

public static IEnumerable<int> CharPositions(string input, char match)
{
   return input
         .Select((x, idx) => new { x, idx })
         .Where(c => c.x == match)
         .Select(c => c.idx);
}

或者,使用简单的for循环:

public static IEnumerable<int> CharPositions(string input, char match)
{
    for (int i = 0; i < input.Length; i++)
    {
       if (input[i] == match)
             yield return i;
    }
}