CSharp - C 最佳方式重复某个字符

  显示原文与译文双语对照的内容

什么是最好的方法来生成一个字符串的t C#

我在学习 C# 并尝试用不同的方式来表达同样的事情。

Tabs(uint t) 是一个函数,它返回 stringt

例如 Tabs(3) 返回 "ttt"

这三种实现 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; 
}

时间:

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


string Tabs(int len) { return new string('t', len); }

其他的解决方案,更喜欢简单的,只有如果这是证明太慢,争取一个更有效的解决方案。

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

在所有版本的.NET 中重复一个字符串,你总是可以这样做


public static string Repeat(string value, int count)
{
 return new StringBuilder().Insert(0, value, count).ToString();
}

对于 chars @CMS new新 String('t', n) 是你最好的选择。

如何使用扩展方法?



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();
 }
}


然后你可以编写:


Debug.WriteLine('-'.Repeat(100));//For Chars 
Debug.WriteLine("Hello".Repeat(100));//For Strings

注意,对简单字符使用 StringBuilder 版本而不是字符串的性能测试为你提供了主要的性能: 在我的计算机上,mesured性能的差异是 1: 20: Debug.WriteLine('-'.Repeat(1000000))//char 版本和
Debug.WriteLine("-".Repeat(1000000))//string 版本


string.Concat(Enumerable.Repeat("ab", 2));

返回

"abab"


string.Concat(Enumerable.Repeat("a", 2));

返回

"aa"

来自。。

中有一个内置函数在. net? 中重复字符串或者 char

扩展方法:


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);
}

这个怎么样:


//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));

使用 String.ConcatEnumerable.Repeat,这比使用 String.Join 要便宜


public static Repeat(this String pattern, int count)
{
 return String.Concat(Enumerable.Repeat(pattern, count));
}

使用 Enumerable.Repeat的第一个示例:


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

可以用 String.Concat 更简洁地重写:


private string Tabs(uint numTabs)
 { 
 return String.Concat(Enumerable.Repeat("t", (int) numTabs));
 }

我知道这个问题已经是五年了,但是有一个简单的方法可以重复一个字符串,甚至可以在. NET 2.0中工作。

要重复字符串:


string repeated = new String('+', 3).Replace("+","Hello,");

返回


"Hello, Hello, Hello,"

要将字符串作为数组重复:


//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(',');

返回


{"Hello","Hello","Hello",""}

保持简单。

...