有一种简单的方法可以返回重复X次的字符串吗?

Abe*_*ler 290 .net c#

我试图在一个基于项深度的字符串之前插入一定数量的缩进,我想知道是否有一种方法可以重复X次返回一个字符串.例:

string indent = "---";
Console.WriteLine(indent.Repeat(0)); //would print nothing.
Console.WriteLine(indent.Repeat(1)); //would print "---".
Console.WriteLine(indent.Repeat(2)); //would print "------".
Console.WriteLine(indent.Repeat(3)); //would print "---------".
Run Code Online (Sandbox Code Playgroud)

Ahm*_*eed 501

如果您只想重复相同的字符,可以使用接受char 的字符串构造函数和重复它的次数new String(char c, int count).

例如,要重复五次破折号:

string result = new String('-', 5); // -----
Run Code Online (Sandbox Code Playgroud)

  • 这是C#非常有用的技巧,但问题的标题是询问字符串(不是char).这个下面的其他答案实际上是回答这个问题,但评价要低得多.我并没有试图不尊重艾哈迈德的答案,但我认为这个问题的标题应该改变(如果问题实际上是关于字符的),或者其他答案真的应该被投票(而不是这个). (80认同)
  • @Ahmad正如我所说,我没有投票,因为我认为你没有提供好的信息,但是因为你提供的信息与回答当前陈述的问题无关.想象一下,如果你正在寻找一种重复字符串(不是字符)的方法,当你得到相关的问题时,你必须滚动几个"有用的"提示来获得问题的实际答案.如果downvote对你有攻击性,我可以删除它.但是你知道我来自哪里吗?我在这里完全偏离基地吗? (14认同)
  • @ pghprogrammer4恕我直言,downvotes可能相当令人沮丧,并且只应用于有害/误导/ really_bad答案,需要进行重大更改或应由作者删除.答案的存在是因为人们很慷慨,希望分享他们所知道的东西.一般来说,这些网站真的会鼓励人们给最高层提供有用的答案. (11认同)
  • 感谢您提醒我这个不错的小功能.我认为它在我的脑海中消失了. (7认同)
  • 这并不能回答问题。我需要重复一个字符串。没有一个字符。 (5认同)
  • 由于选项卡元字符'\ t'是一个字符,因此也适用于缩进. (3认同)

Dan*_*Tao 252

如果您使用的是.NET 4.0,则可以string.Concat与它一起使用Enumerable.Repeat.

int N = 5; // or whatever
Console.WriteLine(string.Concat(Enumerable.Repeat(indent, N)));
Run Code Online (Sandbox Code Playgroud)

否则我会选择亚当的答案.

我通常不会建议使用Andrey的答案的原因很简单,这个ToArray()调用引入了多余的开销,而这种开销可以StringBuilder通过Adam建议的方法来避免.也就是说,至少它可以在不需要.NET 4.0的情况下工作; 它既快速又简单(如果效率不是太大的话,也不会杀了你).

  • 感谢您回答实际的标题问题! (4认同)
  • 这将很好地与字符串一起使用 - 例如,如果你需要连接不间断的空格( ).但我认为如果你正在处理一个字符串,字符串构造函数将是最快的... (3认同)

Ada*_*son 45

public static class StringExtensions
{
    public static string Repeat(this string input, int count)
    {
        if (!string.IsNullOrEmpty(input))
        {
            StringBuilder builder = new StringBuilder(input.Length * count);

            for(int i = 0; i < count; i++) builder.Append(input);

            return builder.ToString();
        }

        return string.Empty;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 也可以将`input.Length*count`传递给`StringBuilder`构造函数,你不觉得吗? (6认同)
  • @AdamRobinson 是否返回空字符串而不是空字符串?我会用 `return input` 替换 `return string.empty`,这样你会得到 null 输入/null 输出,以及空输入/空输出。 (2认同)

c0r*_*0rd 41

字符串的最佳性能解决方案

string result = new StringBuilder().Insert(0, "---", 5).ToString();
Run Code Online (Sandbox Code Playgroud)

  • 当然是一个漂亮的单线。当然不是性能最好的。StringBuilder 对很少数量的连接有一点开销。 (4认同)
  • 性能更高的应该是: string result = new StringBuilder("---".Length * 5).Insert(0, "---", 5).ToString(); (2认同)

Bob*_*ers 20

对于许多场景,这可能是最好的解决方案:

public static class StringExtensions
{
    public static string Repeat(this string s, int n)
        => new StringBuilder(s.Length * n).Insert(0, s, n).ToString();
}
Run Code Online (Sandbox Code Playgroud)

用法是:

text = "Hello World! ".Repeat(5);
Run Code Online (Sandbox Code Playgroud)

这建立在其他答案的基础上(特别是@ c0rd).除了简单性之外,它还具有以下功能,而不是所讨论的所有其他技术共享:

  • 重复任何长度的字符串,而不仅仅是字符(由OP请求).
  • StringBuilder通过存储预分配有效使用.

  • 这是最好的!简单明了 (3认同)

Ste*_*end 19

如果所需的字符串只包含一个char,请使用String.PadLeft.

public static string Indent(int count, char pad)
{
    return String.Empty.PadLeft(count, pad);
}
Run Code Online (Sandbox Code Playgroud)

信用到期

  • 但这不是一个不太明显的[字符串`构造函数的版本,它采用`char`和`int`](http://msdn.microsoft.com/en-us/library/xsa4321w.aspx )? (7认同)

LiR*_*RoN 15

你可以重复你的字符串(如果它不是一个字符)并连接结果,如下所示:

String.Concat(Enumerable.Repeat("---", 5))
Run Code Online (Sandbox Code Playgroud)


Tho*_*que 11

我会选择Dan Tao的答案,但是如果你不使用.NET 4.0,你可以这样做:

public static string Repeat(this string str, int count)
{
    return Enumerable.Repeat(str, count)
                     .Aggregate(
                        new StringBuilder(),
                        (sb, s) => sb.Append(s))
                     .ToString();
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我能在我的项目中找到这个片段,我会想知道是谁违反了KISS以及为什么...... (3认同)
  • 这是一个美丽的代码片段. (2认同)

And*_*rew 7

适用于字符串和字符:

字符串和字符 [版本 1]

string.Join("", Enumerable.Repeat("text" , 2 ));    
//result: texttext
Run Code Online (Sandbox Code Playgroud)

字符串 [版本 2]:

String.Concat(Enumerable.Repeat("text", 2));
//result: texttext
Run Code Online (Sandbox Code Playgroud)

字符串和字符 [版本 3]

new StringBuilder().Insert(0, "text", 2).ToString(); 
//result: texttext
Run Code Online (Sandbox Code Playgroud)

仅字符:

'5' * 3; 
//result: 555
Run Code Online (Sandbox Code Playgroud)

扩展方式:

(工作更快 - 更适合 WEB)

public static class RepeatExtensions
{
    public static string Repeat(this string str, int times)
    {
        var a = new StringBuilder();
        
        //Append is faster than Insert
        ( () => a.Append(str) ).RepeatAction(times) ;
        
        return a.ToString();
    }

    public static void RepeatAction(this Action action, int count)
    {
        for (int i = 0; i < count; i++)
        {
            action();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

用法:

 var a = "Hello".Repeat(3); 
 //result: HelloHelloHello
Run Code Online (Sandbox Code Playgroud)

  • “RepeatAction”似乎是一种不必要的晦涩的“for”方式。 (2认同)