3

假设我们有一个返回字符数组定义的程序 - 所以我们可以将它复制粘贴到其他 C# 代码中。一种可能的结果是以下字符串:

// Current output:
return "CharArray = { {}, {123}, {}, {3 3}, {111}, {}, {}" + "};";

现在我们想消除CharArray末尾多余的空行,同时在开头或中间保留任何空行:

// Desired output:
"CharArray = { {}, {123}, {}, {3 3}, {111}" + "};";

(由于间距的原因,数据之前或之间的任何空行都是必要的,但最后的空白对我们的代码没有任何用处。)

由于在操作之后才添加最后的括号和分号,因此似乎最简单的方法是从字符串中删除“,{}”的所有尾随实例。我目前的解决方案是一个非常开箱即用的替换和修剪组合......

// Red-Green solution:
return output.Replace(", {}", "!").TrimEnd('!').Replace("!", ", {}") + "};";

...它肯定会返回正确的结果,但是冗长,使读者感到困惑,并且很可能使您在第一次阅读时感到畏缩。

此外,我通常用于此类问题的 Regex.Replace 仅删除一个空行(因为字符串末尾仅存在一个),我宁愿不必通过循环提供它:

// Sub-par solution: (birdie solution?)
 return Regex.Replace(testString, ", {}$", "") + "};";

我怎样才能最好地从字符串的末尾删除一系列字符的所有实例?我更喜欢既可读又不会太慢或对机器造成负担的结果。(据用户目前所知,在他们按下按钮后立即返回。)

4

3 回答 3

1

您可以使用正则表达式:

return "\n" + Regex.Replace(testString, "(, {})+$", "") + "};";

这也将替换多次出现的搜索字符串

运算符+表示:前面的表达式出现一次或多次

于 2012-07-30T16:11:16.903 回答
0

试试这个:

    string TrimEndMultiple(string str, string end)
    {
        int lenend = end.Length;

        int start = str.Length - lenend;

        while (String.CompareOrdinal(str, start, end, 0, lenend) == 0)
        {
            start -= lenend;
        }

        // Addendum:
        return str.Substring(0, start + lenend);
    }
于 2012-07-30T21:26:55.160 回答
0

我试了一下,TrimEndMultiple 快了 20 倍:

    [MethodImplAttribute(MethodImplOptions.NoInlining)] 
    static string TrimEndMutiple(string str, string end)
    {
        int lenend = end.Length;

        int start = str.Length - lenend;

        while (String.CompareOrdinal(str, start, end, 0, lenend) == 0)
        {
            start -= lenend;
        }

        return str.Substring(0, start + lenend);
    } 

    static void Main(string[] args)
    {
        string s = "CharArray = { {}, {123}, {}, {3 3}, {111}, {}, {}";

        Regex reg = new Regex("(, {})+$", RegexOptions.Compiled);

        string s1 = reg.Replace(s, "");
        string s2 = TrimEndMutiple(s, ", {}");

        Stopwatch watch = new Stopwatch();

        int count = 1000 * 100;

        watch.Start();

        for (int i = 0; i < count; i++)
        {
            s1 = reg.Replace(s, "");
        }

        watch.Stop();

        Console.WriteLine("{0} {1,9:N3} ms", s1, watch.ElapsedTicks * 1000.0 / Stopwatch.Frequency);

        watch.Restart();

        for (int i = 0; i < count; i++)
        {
            s2 = TrimEndMutiple(s, ", {}"); 
        }

        watch.Stop();

        Console.WriteLine("{0} {1,9:N3} ms", s2, watch.ElapsedTicks * 1000.0 / Stopwatch.Frequency);
    }

结果:

CharArray = { {}, {123}, {}, {3 3}, {111}   298.014 ms
CharArray = { {}, {123}, {}, {3 3}, {111}    15.495 ms
于 2012-08-01T17:36:28.357 回答