5

只是我正在调查的好奇心。

问题:简单地重复(相乘,有人会说)一个字符串/字符n次。
我知道有Enumerable.Repeat来实现这个目标,但我试图在没有它的情况下做到这一点。 在这种情况下, LINQ似乎毫无用处,因为在这样的查询

from X in "s" select X  

字符串" s" 正在被探索,所以 X 是一个char扩展方法也是如此,因为例如“s”。聚合(blablabla) 将再次仅对字符 's' 起作用,而不是字符串本身。为了重复字符串,需要一些“外部”的东西,所以我认为lambdasdelegates,但是如果不声明一个变量来分配委托/lambda 表达式,就无法做到这一点。
所以像定义一个函数并内联调用它:

( (a)=>{return " "+a;} )("a");  

或者

delegate(string a){return " "+a}(" ");  

会给出一个“没有名称”的错误(因此没有递归,AFAIK,即使通过将可能的 lambda/delegate 作为参数传递),最后甚至不能由 C# 创建,因为它的局限性。
可能是我从错误的角度看待这件事。有任何想法吗?
这只是一个实验,我不关心表演,不关心内存使用......只是它是一条线并且有点自主。也许有人可以用 Copy/CopyTo 做某事,或者将其投射到其他集合中,我不知道。反射也被接受。

4

2 回答 2

9

要重复一个字符 n 次,你不会使用Enumerable.Repeat,而只是使用这个字符串构造函数

string str = new string('X', 10);

要重复一个字符串,我不知道有什么比使用string.JoinandEnumerable.Repeat

string foo = "Foo";
string str = string.Join("", Enumerable.Repeat(foo, 10));

编辑:string.Concat如果不需要分隔符,您可以改用:

string str = string.Concat( Enumerable.Repeat(foo, 10) );
于 2012-12-13T16:50:02.087 回答
2

如果你想重复一个字符串,而不是一个字符,一个简单的方法是使用StringBuilder.Insertmethod,它需要一个插入索引和一个要使用的重复次数的计数:

var sb = new StringBuilder();
sb.Insert(0, "hi!", 5);
Console.WriteLine(sb.ToString());

否则,要重复单个字符,请使用我在此处类似问题的评论中提到的字符串构造函数。例如:

string result = new String('-', 5); // -----

为了完整起见,值得注意的是,它StringBuilder提供了一个可以重复字符的重载Append方法,但对于字符串没有这种重载(这是该Insert方法的用处)。StringBuilder如果这就是我感兴趣的全部,我更喜欢字符串构造函数。但是,如果我已经在使用 a ,那么使用该方法从某些链接中受益StringBuilder可能是有意义的。Append这是一个人为的示例来演示:

var sb = new StringBuilder("This item is ");
sb.Insert(sb.Length, "very ", 2) // insert at the end to append
  .Append('*', 3)
  .Append("special")
  .Append('*', 3);
Console.WriteLine(sb.ToString()); // This item is very very ***special***
于 2012-12-13T16:59:43.447 回答