我需要在字符串中获取该类型的第n个字符的索引。
示例:
string test = "asdfasdfasdf";
int index = test.IndexOf("a", 3);
和index
为8,因为第3个a的索引为8
有没有这样做的功能,或者您是否知道如何以聪明的方式做到这一点?
答案 0 :(得分:3)
你可以在一行中完成它,但它并不漂亮:
var s = "aabbabhjhjdsfbaxt";
var idx = s.Select((c, i) => new {c, i})
.Where(p => p.c == 'a')
.Skip(2)
.FirstOrDefault()?.i ?? -1;
我们的想法是将字符与其索引配对,按字符过滤,跳过n-1项,如果存在,则选择下一项。
另一种方法是使用带有look-behind的正则表达式:
var idx = Regex.Match(s, "(?<=(a[^a]*){2})a").Index;
这匹配'a'
前面还有两个'a'
,可能还有中间的其他字符。
答案 1 :(得分:1)
一个简单的for循环可以解决这个问题,但你可以将for循环置于扩展方法中,以便在整个应用程序中将此功能作为一个单行程序。
像这样:
public static int NthIndexOf(this string text, char letter, int occurrence)
{
if (text == null) throw new ArgumentNullException(nameof(text));
int count = 0;
for (int index = 0; index < text.Length; index++)
if (text[index] == letter)
{
if (++count == occurrence)
return index;
}
return -1;
}
用法:
string test = "asdfasdfasdf";
int index = test.IndexOf('a', 3);
答案 2 :(得分:0)
您可以为此创建一个扩展方法:
public static int NthIndexOf(this string s, char c, int occurence)
{
if (s == null) throw new ArgumentNullException(nameof(s));
if (occurence <= 0) return -1;
int i = -1, o = 0;
do
{
i = s.IndexOf(c, i+1);
o++;
} while (i >= 0 && o < occurence);
return i;
}
检查输入参数后,它会连续使用string.IndexOf()
来获取所需字符c
的第n个索引。
如果未发现c
的进一步发生(IndexOf
返回-1
),则循环中断。
用法:
string test = "asdfasdfasdf";
int index = test.NthIndexOf('a', 3); // 8
当然,对于string
而不是c
的{{1}}类型的参数,您可以执行相同操作,但需要将char
更改为s.IndexOf(c, i+1)
答案 3 :(得分:0)
正如RenéVogt所说,出于性能原因,你应该使用一种扩展方法来链接IndexOf()
的调用:
public static int NthIndexOf(this string s, string value, int n)
{
var index = -1;
for (; n > 0; n--)
index = s.IndexOf(value, index + 1);
return index;
}
这将返回字符串n
(基于1)value
出现的从0开始的索引。
以下是一个工作示例:https://dotnetfiddle.net/xlqf2B