string.insert多个值。 这可能吗?

我还在C#学习,有一件事我似乎无法找到答案。

如果我有一个看起来像这样的字符串“abcdefg012345”,我想让它看起来像“ab-cde-fg-012345”

我想这样的事情:

string S1 = "abcdefg012345"; string S2 = S1.Insert(2, "-"); string S3 = S2.Insert(6, "-"); string S4 = S3.Insert..... ... .. 

现在我正在寻找是否有可能以某种方式将这个al变成1行,而不必制作所有这些字符串。

我认为这可能会以某种方式?

无论你是否可以使它成为一个单行(你可以),它总是会导致创建多个字符串,因为.NET中的String是不可变的

如果您想在不创建多个字符串的情况下有效地执行此操作,则可以使用StringBuilder 。 扩展方法也可以使它更容易使用。

 public static class StringExtensions { public static string MultiInsert(this string str, string insertChar, params int[] positions) { StringBuilder sb = new StringBuilder(str.Length + (positions.Length*insertChar.Length)); var posLookup = new HashSet(positions); for(int i=0;i 

请注意,此示例StringBuilderStringBuilder初始化为正确的长度,因此无需增长StringBuilder。

用法: "abcdefg012345".MultiInsert("-",2,5); // yields "abc-def-g012345" "abcdefg012345".MultiInsert("-",2,5); // yields "abc-def-g012345"

实例: http : //rextester.com/EZPQ89741

 string S1 = "abcdefg012345".Insert(2, "-").Insert(6, "-")..... ; 

如果插入的字符串的位置是常量,您可以考虑使用string.Format()方法。 例如:

 string strTarget = String.Format("abc{0}def{0}g012345","-"); 
 string s = "abcdefg012345"; foreach (var index in [2, 6, ...] { s = s.Insert(index, "-"); } 

我喜欢这个

  StringBuilder sb = new StringBuilder("abcdefg012345"); sb.Insert(6, '-').Insert(2, '-').ToString(); 
  String s1 = "abcdefg012345"; String seperator = "-"; s1 = s1.Insert(2, seperator).Insert(6, seperator).Insert(9, seperator); 

像这样链接它们可以减少你的行数。 这是有效的,因为Insert方法返回带有提供的参数的字符串值s1,然后在返回的字符串上调用Insert函数,依此类推。

另外值得注意的是String是一个特殊的不可变类,因此每次为它设置一个值时,它都会被重新创建。 另外值得注意的是,String是一种特殊类型,允许您通过调用构造函数将其设置为新实例,上面的第一行将在语句标记中使用文本调用构造函数。

仅仅为了完成并显示使用鲜为人知的Aggregate函数,这里是另一个单行:

 string result = new[] { 2, 5, 8, 15 }.Aggregate("abcdefg012345", (s, i) => s.Insert(i, "-")); 

result是ab-cd-ef-g01234-5。 不过,我不会推荐这种变体。 一见钟情太难掌握了。

编辑:无论如何,此解决方案无效,因为“ – ”将插入已修改字符串的索引处,而不是插入原始字符串的位置。 但话说回来,这里的大多数答案都会遇到同样的问题。

在这种情况下,你应该使用StringBuilder,因为Strings objectsimmutable ,你的代码实际上会为每个操作创建一个全新的字符串。 http://msdn.microsoft.com/en-us/library/2839d5h5(v=vs.71).aspx

这里提供了更多信息: http : //www.dotnetperls.com/stringbuilder

例:

 namespace ConsoleApplication10 { class Program { static void Main(string[] args) { StringBuilder sb = new StringBuilder("abcdefg012345"); sb.Insert(2, '-'); sb.Insert(6, '-'); Console.WriteLine(sb); Console.Read(); } } } 

如果你真的想要它在单行上,你可以简单地做这样的事情:

 StringBuilder sb = new StringBuilder("abcdefg012345").Insert(2, '-').Insert(6, '-');