字符串 - c#用法




在C#中重复字符的最佳方法 (11)

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

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

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

使用扩展方法怎么样?

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版本进行简单字符而不是字符串的性能测试会给您一个主要的性能限制:在我的计算机上,测试性能的差异为1:20:Debug.WriteLine(' - '。Repeat(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)是你最好的选择。 查看share 。


尝试这个:

  1. 添加Microsoft.VisualBasic参考
  2. 使用:String result = Microsoft.VisualBasic.Strings.StrDup(5,“hi”);
  3. 请让我知道这对你有没有用。

您的第一个使用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, ");

返回

“你好你好你好, ”

重复一个字符串作为数组:

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

返回

{“你好你好你好”, ””}

把事情简单化。


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

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

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

如果您使用StringBuilder并提前知道其结果长度,那么也可以使用适当的构造函数,这样会更加高效,因为这意味着只需进行一次耗时的分配,并且不会发生不必要的数据复制。 胡说八道:当然上面的代码更有效率。


答案真的取决于你想要的复杂性。 例如,我想用一个垂直线来概述我所有的缩进,所以我的缩进字符串按如下方式确定:

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

这个怎么样:

//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 tabs = new String('\t', n);

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

或更好:

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

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






string