0

给定一个刺痛,我如何跳过前 x 个字符,然后为每个 y 个字符插入一个值?

例如:

“Lorem ipsum dolor sit amet,” 

当跳过前 10 个字符然后为每 3 个字符插入“[here]”时变为:

“Lorem ipsu[here]m d[here]olo[here]r s[here]it [here]ame[here]t,”

在 C# 中执行此操作的最有效、最快的方法是什么?

我当前的功能看起来像这样,但没有做跳过部分,我知道如何实现跳过部分,但使用的技术似乎不是最佳的:

public static string InsertHere(string source)
    {
        if (string.IsNullOrWhiteSpace(source))
        {
            return string.Empty;
        }

        int count = 0;
        var sb = new StringBuilder();
        foreach (char c in source)
        {
            count++;
            sb.Append(c);
            if (count == 10)
            {
                count = 0;
                sb.Append(@"[here]");
            }
        }
        return sb.ToString();
    }
4

5 回答 5

0

不确定它是否更快(你真的需要对此进行基准测试):

static Regex Rx = new Regex("(^.{10}|.{3})", RegexOptions.Compiled);

//...
var result = Rx.Replace(input, "$0[here]");

在正则表达式解决方案中使用静态编译的正则表达式以获得最佳速度。

于 2012-08-02T08:21:03.733 回答
0

您必须对它们进行概要分析才能看到最好的方法,但这是我的努力,我已经将字符串阅读器引入了缓冲区方法。

    public static string InsertStringRepeatedly(string source, int skip, int insertEvery, string toInsert)
    {
        var sb = new StringBuilder();
        using (var sr = new StringReader(source))
        {
            var buffer = new char[Math.Max(skip, insertEvery)];
            var read = sr.Read(buffer, 0, skip);
            sb.Append(buffer, 0, read);
            while (sr.Peek() > 0)
            {
                sb.Append(toInsert);
                read = sr.Read(buffer, 0, insertEvery);
                sb.Append(buffer, 0, read);
            }
        }
        return sb.ToString();
    }

编辑:

固定为边缘情况 source.Length < 10 或不是 10 + 3*x 的整数倍。现在也只使用一个缓冲区。

使用示例:

    private static void Main(string[] args)
    {
        var result = InsertStringRepeatedly("Lorem ipsum dolor sit amet,", 10, 3, "[Here]");
        Console.Write("\"");
        Console.Write(result);
        Console.WriteLine("\""); //quotes to show we dealt with edge cases correctly
        Console.ReadLine();
    }
于 2012-08-02T08:21:29.880 回答
0

没必要Regex。尝试String提高性能的方法:

string str = "Lorem ipsum dolor sit amet,";
var rep = "[here]";

var step = 10 + rep.Length;
while (str.Length > step)
{
    str = str.Insert(step, rep);
    step = step + 3 + rep.Length;
}
于 2012-08-02T08:22:31.293 回答
0

我想我不妨把我的修改变成一个答案。

我应该强调,这可能不是最好的方法,但它是对你的代码进行最简单的修改,并且绝对有效......

public static string InsertHere(string source, int skip, int repeatPeriod)
{
    if (string.IsNullOrWhiteSpace(source))
    {
        return string.Empty;
    }

    int count = -1*(skip-repeatPeriod);
    var sb = new StringBuilder();
    foreach (char c in source)
    {
        count++;
        sb.Append(c);
        if (count == repeatPeriod)
        {
            count = 0;
            sb.Append(@"[here]");
        }
    }
    return sb.ToString();
}
于 2012-08-02T08:23:51.907 回答
0

我对 C# 还不是很精通(我有 VB 背景),但首先想到的是:

 string WordProcess(string StringToProcess, string InsertValue, byte NumberToProcess )
    {
        string Result = "";
        while (StringToProcess != "")
        {
            for (byte b = 0; b < NumberToProcess; b++)
            {
                string TempString = StringToProcess;
                Result += TempString.Remove(1, TempString.Length - 1);
                StringToProcess = StringToProcess.Remove(0, 1);
            }
            Result += InsertValue;
        }
        return Result;
    }

我已经尝试过了,它似乎对我来说效果很好,所以你应该能够复制并粘贴它并按原样使用它。不知道它有多快,但它至少可以工作。

我希望你觉得这很有用/有帮助。

于 2012-08-02T08:29:52.923 回答