使用LINQ / extensions方法重复字符串

时间:2012-12-13 16:46:09

标签: c#-4.0

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

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

from X in "s" select X  

正在探索字符串“s”,因此X是字符扩展方法也是如此,因为例如“s”。聚合(blablabla)将再次处理字符'',而不是字符串本身。为了重复字符串,需要一些“外部”,所以我想 lambdas 委托,但如果没有声明一个变量来分配委托/ lambda就无法完成表达到 就像定义一个函数并将其调用内联一样:

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

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

会出现“无名称”错误(因此无递归,AFAIK,即使将可能的lambda / delegate作为参数传递),最后也是如此由于其局限性,甚至无法由C#创建 可能是我从错误的角度看这件事。任何想法?
这只是一个实验,我不关心表演,关于记忆的使用......只是它是一线而且是一种自主的。也许我可以用Copy / CopyTo做一些事情,或者将它投射到其他一些系列,我不知道。 反思也被接受。

2 个答案:

答案 0 :(得分:6)

要重复一次字符n次,你不会使用Enumerable.Repeat而只是this string constructor

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

重复一个字符串我不知道比使用string.JoinEnumerable.Repeat更好的事情

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

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

string str = string.Concat( Enumerable.Repeat(foo, 10) );

答案 1 :(得分:2)

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

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

否则,要重复单个字符,请使用我在similar question here的注释中提到的字符串构造函数。例如:

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

为了完整起见,值得注意的是StringBuilder提供了一个overloaded Append method可以重复一个字符,但字符串没有这样的重载(这是Insert方法来的地方在)。我更喜欢字符串构造函数到StringBuilder,如果这是我感兴趣的话。但是,如果我已经使用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***