سؤال

إلا إذا أنا في عداد المفقودين واضح المدمج في الأسلوب ، ما هي أسرع طريقة للحصول على nال حدوث سلسلة في سلسلة ؟

وأنا أدرك أن أنا يمكن أن حلقة IndexOf طريقة تحديث بدء مؤشر على كل التكرار من الحلقة.ولكن القيام بهذه الطريقة يبدو الإسراف لي.

هل كانت مفيدة؟

المحلول

هذا هو أساسا ما عليك القيام به - أو على الأقل ، هو أسهل حل.سيكون "إضاعة" هي تكلفة ن طريقة الدعاء - لن يكون في الواقع فحص أي حالة ضعف ، إذا كنت تفكر في ذلك.(IndexOf سيعود في أقرب وقت كما يرى المباراة, وسوف تستمر من حيث توقفت.)

نصائح أخرى

هل حقا يمكن استخدام التعبير العادي /((s).*?){n}/ البحث عن n-th حدوث فرعية s.

في 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 أن الحل الأصلي للسماح البحث عن الشخصيات التي لها معنى خاص regex المحرك.

هذا هو أساسا ما عليك القيام به - أو على الأقل ، هو أسهل حل.سيكون "إضاعة" هي تكلفة ن طريقة الدعاء - لن يكون في الواقع فحص أي حالة ضعف ، إذا كنت تفكر في ذلك.(IndexOf سيعود في أقرب وقت كما يرى المباراة, وسوف تستمر من حيث توقفت.)

هنا هو تنفيذ العودية (من فوق فكرة) امتدادا الأسلوب ، mimicing شكل إطار الأسلوب(s):

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) وحدة الاختبارات التي قد تساعدك على (أن يثبت أنه هو الصحيح):

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() طريقة التحقق إذا طلب التواجد في مجموعة ، إذا كنت لا تحتاج إلى المؤشر ، ولكن القيمة في مؤشر

بعد القياس, يبدو أن هذا هو أبسط effcient الحل

public static int IndexOfNthSB(string input,
             char value, int startIndex, int nth)
        {
            if (nth < 1)
                throw new NotSupportedException("Param 'nth' must be greater than 0!");
            var nResult = 0;
            for (int i = startIndex; i < input.Length; i++)
            {
                if (input[i] == value)
                    nResult++;
                if (nResult == nth)
                    return i;
            }
            return -1;
        }

النظام.ValueTuple ftw:

var index = line.Select((x, i) => (x, i)).Where(x => x.Item1 == '"').ElementAt(5).Item2;

كتابة وظيفة من أن الواجبات المنزلية

وهذا قد فعل ذلك:

Console.WriteLine(str.IndexOf((@"\")+2)+1);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top