IndexOf该类型的第n个字符

时间:2016-08-29 15:19:45

标签: c# indexof

我需要在字符串中获取该类型的第n个字符的索引。

示例:

string test = "asdfasdfasdf";
int index = test.IndexOf("a", 3);

index为8,因为第3个a的索引为8

有没有这样做的功能,或者您是否知道如何以聪明的方式做到这一点?

4 个答案:

答案 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