输入是一个字符串和一个字符,即:
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();
}
有没有更有效率的方法呢?
答案 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;
}
}