我正在尝试创建一个函数,该函数返回字符串中给定字符第N次出现的索引。
这是我的尝试:
private int IndexOfNth(string str, char c, int n)
{
int index = str.IndexOf(c) + 1;
if (index >= 0)
{
string temp = str.Substring(index, str.Length - index);
for (int j = 1; j < n; j++)
{
index = temp.IndexOf(c) + 1;
if (index < 0)
{
return -1;
}
temp = temp.Substring(index, temp.Length - index);
}
index = index + (str.Length);
}
return index;
}
这应该找到第一个匹配项,去掉字符串的前面部分,从新的子字符串中找到第一个匹配项,然后继续下去,直到得到第n个匹配项的索引。然而,我没有考虑到最后一个子串的索引将如何从原始字符串中的原始实际索引偏移。我该怎么做呢?
另外,作为一个次要问题,如果我想让char作为制表符,我应该传递这个函数'\t‘还是什么?
发布于 2012-07-06 21:33:56
使用LINQ查找字符串aababaababa
中的第5个a
的索引
var str = "aababaababa";
var ch = 'a';
var n = 5;
var result = str
.Select((c, i) => new { c, i })
.Where(x => x.c == ch)
.Skip(n - 1)
.FirstOrDefault();
return result != null ? result.i : -1;
发布于 2012-07-06 21:29:27
不要这样做;IndexOf
接受第二个参数,该参数指定从哪里开始。
private static int IndexOfNth(string str, char c, int n) {
int s = -1;
for (int i = 0; i < n; i++) {
s = str.IndexOf(c, s + 1);
if (s == -1) break;
}
return s;
}
发布于 2012-07-06 21:29:04
在我看来,获取所有这些子字符串是非常浪费的。为什么不直接循环你自己呢?
private int IndexOfNth(string str, char c, int n)
{
int remaining = n;
for (int i = 0; i < str.Length; i++)
{
if (str[i] == c)
{
remaining--;
if (remaining == 0)
{
return i;
}
}
}
return -1;
}
(我考虑过在一个循环中使用IndexOf
,就像minitech的解决方案一样,但我觉得这样做有点麻烦。当然,这两个都很好。两者基本上做相同的工作,只检查每个字符一次。使用IndexOf
可能会稍微高效一些,但请选择您认为更具可读性的方法。)
https://stackoverflow.com/questions/11363083
复制相似问题