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

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

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

Tabs(uint t)是一个返回string的函数,其中t的数量为\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;}
499868 次浏览

这个怎么样:

string tabs = new string('\t', n);

其中n是您想要重复字符串的次数。

或者更好:

static string Tabs(int n){return new string('\t', n);}

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

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

在其他解决方案中,选择最简单的;只有当这被证明太慢时,才努力寻找更有效的解决方案。

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

如何使用扩展方法?


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 CharsDebug.WriteLine("Hello".Repeat(100)); // For Strings

请注意,对简单字符而不是字符串使用stringBuilder版本的性能测试会给您带来重大的性能损失:在我的电脑上,我的表现之间的差异是1:20:Debug. WriteLine('-'.重复(1000000))//char版本和
Debug. WriteLine("-". Repeat(1000000))//字符串版本

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

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

要重复一个字符,new String('\t', count)是你最好的选择。见答案@CMS

答案实际上取决于你想要的复杂性。例如,我想用竖线概述我所有的缩进,所以我的缩进字符串确定如下:

return new string(Enumerable.Range(0, indentSize*indent).Select(n => n%4 == 0 ? '|' : ' ').ToArray());

扩展方法:

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

第一个使用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));}

这个怎么样:

//Repeats a character specified number of timespublic static string Repeat(char character,int numberOfIterations){return "".PadLeft(numberOfIterations, character);}
//Call the Repeat methodConsole.WriteLine(Repeat('\t',40));
string.Concat(Enumerable.Repeat("ab", 2));

退货

"abab"

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

退货

"aa"

从…

是否有一个内置函数来重复. net中的字符串或字符?

使用String.ConcatEnumerable.Repeat会更便宜比使用String.Join

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

假设你想重复'\t'n次,你可以使用;

String.Empty.PadRight(n,'\t')
var str = new string(Enumerable.Repeat('\t', numTabs).ToArray());

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

重复一个字符串:

string repeated = new String('+', 3).Replace("+", "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",""}

保持简单。

试试这个:

  1. 添加Microsoft. VisualBasic参考
  2. 使用:字符串结果=Microsoft. VisualBasic. Strings. StrDup(5,"hi");
  3. 让我知道它是否为你工作。

还有另一种方法

new System.Text.StringBuilder().Append('\t', 100).ToString()

您可以创建扩展方法

static class MyExtensions{internal static string Repeat(this char c, int n){return new string(c, n);}}

然后你可以像这样使用它

Console.WriteLine('\t'.Repeat(10));

对我来说很好:

public static class Utils{public static string LeftZerosFormatter(int zeros, int val){string valstr = val.ToString();
valstr = new string('0', zeros) + valstr;
return valstr.Substring(valstr.Length - zeros, zeros);}}

毫无疑问,公认的答案是重复单个字符的最佳和最快的方法。

Binoj Anthony的答案是一种简单而有效的重复字符串的方法。

但是,如果你不介意更多的代码,你可以使用我的数组填充技术来更快地有效地创建这些字符串。在我的比较测试中,下面的代码大约在StringBuilder.插入代码的35%的时间内执行。

public static string Repeat(this string value, int count){var values = new char[count * value.Length];values.Fill(value.ToCharArray());return new string(values);}
public static void Fill<T>(this T[] destinationArray, params T[] value){if (destinationArray == null){throw new ArgumentNullException("destinationArray");}
if (value.Length > destinationArray.Length){throw new ArgumentException("Length of value array must not be more than length of destination");}
// set the initial array valueArray.Copy(value, destinationArray, value.Length);
int copyLength, nextCopyLength;
for (copyLength = value.Length; (nextCopyLength = copyLength << 1) < destinationArray.Length; copyLength = nextCopyLength){Array.Copy(destinationArray, 0, destinationArray, copyLength, copyLength);}
Array.Copy(destinationArray, 0, destinationArray, copyLength, destinationArray.Length - copyLength);}

有关此数组填充技术的更多信息,请参阅用单个值填充数组的最快方法

虽然与之前的建议非常相似,但我喜欢保持简单并应用以下内容:

string MyFancyString = "*";int strLength = 50;System.Console.WriteLine(MyFancyString.PadRight(strLength, "*");

标准。网真的,

用6,435 z填充屏幕::Repeat([string]::new("z",143),45)

$str

        string input = "abc"string output = "";for (int i = 0; i < input.Length; i++){output += input[i].ToString() + input[i].ToString();         
}Console.WriteLine( output);

//处理结果