এটিই মূলত আপনার যা করা দরকার - বা কমপক্ষে, এটি সবচেয়ে সহজ সমাধান। আপনি যে সমস্ত "নষ্ট" হবেন তা হ'ল এন পদ্ধতির অনুরোধগুলির ব্যয় - আপনি যদি সত্যিই এটির বিষয়ে চিন্তা করেন তবে আপনি দুবার কোনও মামলা যাচাই করবেন না। (ম্যাচটি খুঁজে পাওয়ার সাথে সাথে সূচকগুলি ফিরে আসবে এবং আপনি এটি যেখানে ছেড়েছেন সেখান থেকে চালিয়ে যাবেন))
ফ্রেমওয়ার্ক পদ্ধতি (গুলি) এর ফর্ম্যাটটি নকল করে এখানে একটি এক্সটেনশন পদ্ধতি হিসাবে পুনরাবৃত্তিমূলক বাস্তবায়ন (উপরের ধারণার ) রয়েছে:
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);
}
এছাড়াও, এখানে কয়েকটি (এমবিউনিত) ইউনিট পরীক্ষা রয়েছে যা আপনাকে সহায়তা করতে পারে (এটি সঠিক প্রমাণ করতে):
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));
}
}
}