C# C语言中的乘法字符串#

C# C语言中的乘法字符串#,c#,string,indentation,C#,String,Indentation,可能重复: 在Python中,我可以做到这一点: >>> i = 3 >>> 'hello' * i 'hellohellohello' 如何在C#中与Python中类似地对字符串进行乘法?我可以很容易地在for循环中完成,但这会变得单调乏味,没有表现力 最终,我以递归方式编写控制台,每次调用都会增加缩进级别 parent child child child grandchild 最简单的方法是只做“\t”*ind

可能重复:

在Python中,我可以做到这一点:

>>> i = 3
>>> 'hello' * i
'hellohellohello'
如何在C#中与Python中类似地对字符串进行乘法?我可以很容易地在for循环中完成,但这会变得单调乏味,没有表现力

最终,我以递归方式编写控制台,每次调用都会增加缩进级别

parent
    child
    child
    child
        grandchild

最简单的方法是只做
“\t”*indent

在C#中没有这样的语句;您最好的选择可能是您自己的multilystring()函数。

中有一个扩展方法

公共静态字符串乘法(此字符串源,整数乘法器)
{
StringBuilder sb=新的StringBuilder(乘数*源.Length);
对于(int i=0;i”。乘以(10);

如果您只需要一个字符,可以执行以下操作:

new string('\t', i)

有关更多信息,请参阅。

BCL中没有内置的功能,但是一点LINQ就可以轻松完成任务:

var multiplied = string.Join("", Enumerable.Repeat("hello", 5).ToArray());
每百万人:

public static string times(this string str, int count)
{
  StringBuilder sb = new StringBuilder();
  for(int i=0; i<count; i++) 
  {
    sb.Append(str);
  }
  return sb.ToString();
}
公共静态字符串时间(此字符串str,int count)
{
StringBuilder sb=新的StringBuilder();

对于(inti=0;i来说,一种方法是如下所示——但这并没有那么好

 String.Join(String.Empty, Enumerable.Repeat("hello", 3).ToArray())
更新

啊哈…我记得…因为

 new String('x', 3)

只要您只想重复一个字符,就可以使用字符串构造函数:

string indentation = new String('\t', indent);

用linq聚合怎么样

var combined = Enumerable.Repeat("hello", 5).Aggregate("", (agg, current) => agg + current);
我是这样做的

string value = new string(' ',5).Replace(" ","Apple");

我不认为您可以使用运算符重载扩展System.String,但您可以创建一个字符串包装器类来完成此操作

public class StringWrapper
{
    public string Value { get; set; }

    public StringWrapper()
    {
        this.Value = string.Empty;
    }

    public StringWrapper(string value)
    {
        this.Value = value;
    }

    public static StringWrapper operator *(StringWrapper wrapper,
                                           int timesToRepeat)
    {
        StringBuilder builder = new StringBuilder();

        for (int i = 0; i < timesToRepeat; i++)
        {
            builder.Append(wrapper.Value);
        }

        return new StringWrapper(builder.ToString());
    }
}
并从中获取值

helloTimesThree.Value;

当然,明智的做法是让您的函数跟踪并传入当前深度,然后在此基础上以for循环的形式转储制表符。

如果需要字符串3次,只需这样做

string x = "hello";

string combined = x + x + x;


写一个扩展方法,这样你就可以做“hello.times(5)”(如果我知道C#,我会在回答中做)。除非C#允许运算符重载;是吗?@Eric:被谁认为是有害的?它可能非常有用。我对此没有问题。完全重复@Eric:扩展方法的可见性仅限于该方法的声明命名空间,而不是扩展类型的所有用户。我会将乘数设为uint以防止无限循环。非常灵活。我肯定会开始使用它。如果乘数为负,则在创建StringBuilder时会引发异常,并且循环在任何情况下都不会运行…使用StringBuilder进行此操作可能会有点过头,除非乘数通常非常大(如千倍).根据我自己的测试,使用StringBuilder指定缓冲区大小(如此处所示)在速度上达到了3-4次连接的平衡。这可以解决我眼前的问题,因此我猜这是公认的答案。通常情况下,这不起作用。:)我真的认为Shane Fulmer发布的扩展方法是一个更好的解决方案。我会将他的回答标记为IMHO的答案。@Chris,那么我如何在导致这个问题的我的特定问题的更好答案和更好、更一般的答案之间做出决定?我认为Shane Fulmer的答案是对你的特定问题的更优雅的解决方案。在你只需执行“\t”。乘法(i)。不是说我不欣赏这些要点:),只是认为他的解决方案优于我的解决方案。与我的解决方案相同。这不是最优雅的,但至少很简单。:)Re:您的更新,请参阅公认的答案。扩展不是很好。我做了一些简单的性能测试,发现这比
StringBuilder
strin更快g、 Join
version。此解决方案刚刚使我的一天!var combined=Enumerable.Repeat(“hello”,5)。Aggregate(new StringBuilder(),(agg,current)=>agg.Append(current)).ToString();
var helloTimesThree = new StringWrapper("hello") * 3;
helloTimesThree.Value;
string x = "hello";

string combined = x + x + x;