在C#中重复一个字符的最佳方法

Ale*_*sky 751 .net c# string

什么\t是在C#中生成字符串的最佳方法

我正在学习C#并尝试不同的方式来说同样的事情.

Tabs(uint t)是返回的功能stringt的量\t

例如Tabs(3)返回"\t\t\t"

这三种实施方式中哪Tabs(uint numTabs)一种最好?

当然,这取决于"最佳"的含义.

  1. LINQ版本只有两行,很不错.但重复和聚合的调用是否会不必要地耗费时间/资源?

  2. StringBuilder版本是很清楚的,但是是StringBuilder类莫名其妙慢?

  3. string版本是基本的,这意味着它很容易理解.

  4. 这根本不重要吗?它们都是平等的吗?

这些都是帮助我更好地了解C#的问题.

private string Tabs(uint numTabs)
{
    IEnumerable<string> tabs = Enumerable.Repeat("\t", (int) numTabs);
    return (numTabs > 0) ? tabs.Aggregate((sum, next) => sum + next) : ""; 
}  

private string Tabs(uint numTabs)
{
    StringBuilder sb = new StringBuilder();
    for (uint i = 0; i < numTabs; i++)
        sb.Append("\t");

    return sb.ToString();
}  

private string Tabs(uint numTabs)
{
    string output = "";
    for (uint i = 0; i < numTabs; i++)
    {
        output += '\t';
    }
    return output; 
}
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 1400

那这个呢:

string tabs = new String('\t', n);
Run Code Online (Sandbox Code Playgroud)

n您想要重复字符串的次数在哪里.

或更好:

static string Tabs(int n)
{
    return new String('\t', n);
}
Run Code Online (Sandbox Code Playgroud)

  • @ user1478137或者,更好(也更进一步):[this](http://stackoverflow.com/a/15390726/2030691) (6认同)
  • 有什么办法可以重复这个词吗?而不是使用 '\t' 如何使用“时间” (2认同)

Car*_*lin 135

string.Concat(Enumerable.Repeat("ab", 2));
Run Code Online (Sandbox Code Playgroud)

返回

"ABAB"

string.Concat(Enumerable.Repeat("a", 2));
Run Code Online (Sandbox Code Playgroud)

返回

"AA"

从...

是否有内置函数在.net中重复字符串或字符?

  • 它可能不会更快,但如果你预先指定正确的容量,它可以节省内存分配(压力),这可能与分析这个的微基准一样重要. (6认同)
  • var strRepeat = string.Concat(Enumerable.Repeat("ABC", 1000000)); //50ms (5认同)
  • ''StringBuilder''未必更快http://stackoverflow.com/questions/585860/string-join-vs-stringbuilder-which-is-faster (4认同)
  • 在没有 Linq 的情况下使用 `StruingBuilder` 让它变得更好! (2认同)

Bin*_*ony 120

在所有版本的.NET中,您可以重复一个字符串:

public static string Repeat(string value, int count)
{
    return new StringBuilder(value.Length * count).Insert(0, value, count).ToString();
}
Run Code Online (Sandbox Code Playgroud)

重复一个角色,new String('\t', count)是你最好的选择.请参阅@CMS的答案.

  • 这是迄今为止String最快的性能.其他方法会产生太多开销. (7认同)

Kon*_*lph 62

最好的版本肯定是使用内置方式:

string Tabs(int len) { return new string('\t', len); }
Run Code Online (Sandbox Code Playgroud)

在其他解决方案中,更喜欢最简单; 只有当这证明太慢时,才能寻求更有效的解决方案.

如果你StringBuilder事先使用a 并知道它的结果长度,那么也使用适当的构造函数,这样更有效,因为它意味着只进行一次耗时的分配,并且没有不必要的数据复制. 废话:当然上面的代码更有效率.

  • sb.Append('\ t',len); (12认同)
  • 我的基准测试显示`new string('\ t',len)`比`StringBuilder'方法快2到7倍.为什么你认为`StringBuilder`在这种情况下效率更高? (7认同)
  • @StriplingWarrior感谢您对此进行了更正(在它已经站在这里两年之后,不会少!). (6认同)

Rod*_*man 51

扩展方法:

public static string Repeat(this string s, int n)
{
    return new String(Enumerable.Range(0, n).SelectMany(x => s).ToArray());
}

public static string Repeat(this char c, int n)
{
    return new String(c, n);
}
Run Code Online (Sandbox Code Playgroud)

  • 曾几何时人们使用while循环 (38认同)
  • `Enumerable.Range(0,n).SelectMany(x => s)`可以用简单的`Enumerable.Repeat(s,n)`代替. (10认同)
  • @Palec不,它不能。对于每个单个虚拟`x`,`SelectMany`将给出一个`char`值序列(因为`string s`实现`IEnumerable &lt;char&gt;`),并且所有这些`char`序列都被连接为一个长`char`。 `顺序。您的建议将改为提供一个IEnumerable &lt;string&gt;。不一样 (3认同)
  • @prabhakaran我同意但是Linq的优势在于沟通; 使用命令式构造重新实现Linq表达式几乎总是微不足道的. (2认同)
  • 我错了,@ JeppeStigNielsen。感谢您的单挑。如果我真的想使用`Enumerable.Repeat`,则必须将字符串连接在一起:`string.Concat(Enumerable.Repeat(s,n))`。这已经[以前发布过](/sf/answers/1077350851/)。 (2认同)

Ron*_*nie 40

那么使用扩展方法呢?


public static class StringExtensions
{
   public static string Repeat(this char chatToRepeat, int repeat) {

       return new string(chatToRepeat,repeat);
   }
   public  static string Repeat(this string stringToRepeat,int repeat)
   {
       var builder = new StringBuilder(repeat*stringToRepeat.Length);
       for (int i = 0; i < repeat; i++) {
           builder.Append(stringToRepeat);
       }
       return builder.ToString();
   }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以写:

Debug.WriteLine('-'.Repeat(100)); // For Chars  
Debug.WriteLine("Hello".Repeat(100)); // For Strings
Run Code Online (Sandbox Code Playgroud)

请注意,对于简单字符而不是字符串使用stringbuilder版本的性能测试会给你一个主要的性能压力:在我的计算机上,测量性能的差异在1:20之间:Debug.WriteLine(' - '.重复(1000000)) // char版本和
Debug.WriteLine(" - ".重复(1000000))//字符串版本

  • 使用[`StringBuilder.Insert(Int32,String,Int32)`](https://msdn.microsoft.com/en-us/library/62eb5xsf%28v=vs.110%)可以提高字符串版本的性能29.aspx),正如[Binoj Anthony回答](http://stackoverflow.com/a/720915/2157640). (2认同)

小智 22

这个怎么样:

//Repeats a character specified number of times
public static string Repeat(char character,int numberOfIterations)
{
    return "".PadLeft(numberOfIterations, character);
}

//Call the Repeat method
Console.WriteLine(Repeat('\t',40));
Run Code Online (Sandbox Code Playgroud)

  • 哈哈......当我陷入这种情况时,这就是我能想到的.但我个人发现`new string('\ t',10)`是最好的解决方案 (4认同)

Cha*_*imG 20

我知道这个问题已经有五年了,但有一种简单的方法可以重复一个甚至可以在.Net 2.0中运行的字符串.

要重复一个字符串:

string repeated = new String('+', 3).Replace("+", "Hello, ");
Run Code Online (Sandbox Code Playgroud)

返回

"你好你好你好, "

要将字符串重复为数组:

// Two line version.
string repeated = new String('+', 3).Replace("+", "Hello,");
string[] repeatedArray = repeated.Split(',');

// One line version.
string[] repeatedArray = new String('+', 3).Replace("+", "Hello,").Split(',');
Run Code Online (Sandbox Code Playgroud)

返回

{"你好你好你好", ""}

把事情简单化.


小智 18

假设你要重复'\ t'次数,你可以使用;

String.Empty.PadRight(n,'\t')
Run Code Online (Sandbox Code Playgroud)


Ray*_*ega 17

你的第一个例子使用Enumerable.Repeat:

private string Tabs(uint numTabs)
{
    IEnumerable<string> tabs = Enumerable.Repeat(
                                 "\t", (int) numTabs);
    return (numTabs > 0) ? 
            tabs.Aggregate((sum, next) => sum + next) : ""; 
} 
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式更紧凑地重写String.Concat:

private string Tabs(uint numTabs)
{       
    return String.Concat(Enumerable.Repeat("\t", (int) numTabs));
}
Run Code Online (Sandbox Code Playgroud)


bra*_*ing 14

使用String.Concat和使用Enumerable.Repeat哪个比使用便宜String.Join

public static Repeat(this String pattern, int count)
{
    return String.Concat(Enumerable.Repeat(pattern, count));
}
Run Code Online (Sandbox Code Playgroud)


w.b*_*w.b 9

var str = new string(Enumerable.Repeat('\t', numTabs).ToArray());
Run Code Online (Sandbox Code Playgroud)