0

刺された場合、最初のx文字をスキップしてから、y文字ごとに値を挿入するにはどうすればよいですか?

例えば:

“Lorem ipsum dolor sit amet,” 

最初の10個の文字をスキップしてから、3個の文字ごとに「[ここ]」を挿入すると、次のようになります。

“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

何が最善かを見るためにそれらをプロファイリングする必要がありますが、これが私の努力です。私は文字列リーダーをバッファアプローチに取り入れました。

    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の倍数ではない場合に修正されました。また、今は1つのバッファーだけを使用してください。

使用例:

    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

する必要はありませんRegexStringパフォーマンスを向上させる方法を試してください。

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

それが速いかどうかわからない(あなたは本当にこれをベンチマークする必要があります):

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 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 に答える