2016-03-04 86 views
2

我发现,发现的value第N次出现到一些input串一个不错的扩展方法:C#string.IndexOfNthFromEnd()扩展方法

public static int IndexOfNth(this string input, string value, int startIndex, int nth) 
{ 
    if (nth < 1) 
     throw new ArgumentException("Can not find the zeroth index of substring in string. Must start with 1"); 
    if (nth == 1) 
     return input.IndexOf(value, startIndex, StringComparison.Ordinal); 
    var idx = input.IndexOf(value, startIndex, StringComparison.Ordinal); 
    if (idx == -1) 
     return -1; 
    return input.IndexOfNth(value, idx + value.Length, --nth); 
} 

我需要下一个,但不能改变它自己:

IndexOfNthFromEnd(this string input, string value, int nth) 

它应该从字符串结尾找到第N个出现的索引。例如:

IndexOfNthFromEnd("-!-!----", "!", 2) // = 1; 
IndexOfNthFromEnd("-!-!----", "!", 1) // = 3; 
IndexOfNthFromEnd("-!-!----", "-!", 2) // = 0; 
IndexOfNthFromEnd("-!-!----", "-!", 1) // = 2; 

回答

1
public static int IndexOfNthFromEnd(this string input, string value, int startIndex, int nth) 
{ 
    if (nth < 1) 
     throw new ArgumentException("Can not find the zeroth index of substring in string. Must start with 1"); 
    var idx = input.LastIndexOf(value, startIndex, StringComparison.Ordinal); 
    if (idx == -1 || nth == 1) 
     return idx; 
    return input.IndexOfNthFromEnd(value, idx - value.Length, --nth); 
} 

请注意,您的原始IndexOfNth应该真正做到:

return input.IndexOfNth(value, idx + value.Length, --nth); 

否则为:"abababa".IndexOfNth("bab", 0, 2)它返回3,当它应该是-1,因为bab只出现在字符串中的一次。

+0

是的,你是赖特!谢谢! – AsValeO

0

也许不是最完美的解决方案,但你可以用倒转输入字符串:

char[] charArray = s.ToCharArray(); 
    Array.Reverse(charArray); 
    (new string(charArray)).IndexOfNth("-!-!----", "!", 2); 

,并使用相同的扩展方法。

+0

但如果一个'value'不是一个单一的符号.. – AsValeO

+0

是的,好点的,我想你将不得不扭转太超值了。就像我说的,不雅! – Richard

1

下面是一个迭代方法,用于在问题中保留签名(即没有开始索引参数)。如果你的字符串包含很多重复,它可能不是最有效的方法,但它可以工作。我还没有添加任何来自原始例程的可爱参数验证。

public static int IndexOfNthFromEnd(this string input, string value, int nth) 
{ 
    var newString = input; 
    var index = 0; 

    while (nth-- > 0 && index >= 0) 
    { 
     index = newString.LastIndexOf(value); 
     newString = newString.Substring(0, index); 
    } 

    return index; 
} 
1

试试这个,请看看这个example

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; 
}