获取第n个string的索引?

除非我缺less一个明显的内置方法,那么在string中获得第n个string的最快方法是什么?

我意识到我可以通过在循环的每次迭代中更新其开始索引来循环IndexOf方法。 但是这样做对我来说似乎很浪费。

这基本上是你需要做的 – 或者至less,这是最简单的解决scheme。 所有你会“浪费”的是n个方法调用的代价 – 如果你仔细想想,你实际上不会检查任何情况。 (IndexOf会在find匹配项后立即返回,您将继续从离开的位置继续。)

你真的可以使用正则expression式/((s).*?){n}/search第n次出现的子strings

在C#中,它可能看起来像这样:

 public static class StringExtender { public static int NthIndexOf(this string target, string value, int n) { Match m = Regex.Match(target, "((" + Regex.Escape(value) + ").*?){" + n + "}"); if (m.Success) return m.Groups[2].Captures[n - 1].Index; else return -1; } } 

注意:我已经将Regex.Escape添加到原始解决scheme,以允许search具有特殊含义的字符到正则expression式引擎。

这基本上是你需要做的 – 或者至less,这是最简单的解决scheme。 所有你会“浪费”的是n个方法调用的代价 – 如果你仔细想想,你实际上不会检查任何情况。 (IndexOf一旦find匹配就会返回,并且你将继续离开它的位置。)

下面是作为扩展方法的recursion实现(上述想法 ),模仿框架方法的格式:

 public static int IndexOfNth(this string input, string value, int startIndex, int nth) { if (nth < 1) throw new NotSupportedException("Param 'nth' must be greater than 0!"); if (nth == 1) return input.IndexOf(value, startIndex); var idx = input.IndexOf(value, startIndex); if (idx == -1) return -1; return input.IndexOfNth(value, idx + 1, --nth); } 

另外,这里有一些(MBUnit)unit testing可能会帮助你(certificate它是正确的):

 using System; using MbUnit.Framework; namespace IndexOfNthTest { [TestFixture] public class Tests { //has 4 instances of the private const string Input = "TestTest"; private const string Token = "Test"; /* Test for 0th index */ [Test] public void TestZero() { Assert.Throws<NotSupportedException>( () => Input.IndexOfNth(Token, 0, 0)); } /* Test the two standard cases (1st and 2nd) */ [Test] public void TestFirst() { Assert.AreEqual(0, Input.IndexOfNth("Test", 0, 1)); } [Test] public void TestSecond() { Assert.AreEqual(4, Input.IndexOfNth("Test", 0, 2)); } /* Test the 'out of bounds' case */ [Test] public void TestThird() { Assert.AreEqual(-1, Input.IndexOfNth("Test", 0, 3)); } /* Test the offset case (in and out of bounds) */ [Test] public void TestFirstWithOneOffset() { Assert.AreEqual(4, Input.IndexOfNth("Test", 4, 1)); } [Test] public void TestFirstWithTwoOffsets() { Assert.AreEqual(-1, Input.IndexOfNth("Test", 8, 1)); } } } 
 private int IndexOfOccurence(string s, string match, int occurence) { int i = 1; int index = 0; while (i <= occurence && (index = s.IndexOf(match, index + 1)) != -1) { if (i == occurence) return index; i++; } return -1; } 

或者在C#中使用扩展方法

 public static int IndexOfOccurence(this string s, string match, int occurence) { int i = 1; int index = 0; while (i <= occurence && (index = s.IndexOf(match, index + 1)) != -1) { if (i == occurence) return index; i++; } return -1; } 

也许用String.Split()方法工作也不错,如果你不需要索引,检查索引值是否在数组中

这可能做到这一点:

 Console.WriteLine(str.IndexOf((@"\")+2)+1);