2016-03-04 111 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; 
}