我还在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行,而不必制作所有这些字符串。
我认为这有可能以某种方式?
答案 0 :(得分:7)
由于.NET中String
的{{3}},它是否可以使这个单行(你可以),它总是会导致创建多个字符串>
如果您想在不创建多个字符串的情况下有效地执行此操作,则可以使用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<int>(positions);
for(int i=0;i<str.Length;i++)
{
sb.Append(str[i]);
if(posLookup.Contains(i))
sb.Append(insertChar);
}
return sb.ToString();
}
}
请注意,此示例预先将StringBuilder
初始化为正确的长度,因此无需增长StringBuilder。
用法:"abcdefg012345".MultiInsert("-",2,5); // yields "abc-def-g012345"
实例:immutability
答案 1 :(得分:4)
string S1 = "abcdefg012345".Insert(2, "-").Insert(6, "-")..... ;
答案 2 :(得分:2)
如果插入字符串的位置不变,您可以考虑使用string.Format()
方法。例如:
string strTarget = String.Format("abc{0}def{0}g012345","-");
答案 3 :(得分:1)
string s = "abcdefg012345";
foreach (var index in [2, 6, ...]
{
s = s.Insert(index, "-");
}
答案 4 :(得分:0)
在这种情况下,你应该使用StringBuilder,因为Strings objects
是immutable
,你的代码实际上会为每个操作创建一个全新的字符串。
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, '-');
答案 5 :(得分:0)
我喜欢这个
StringBuilder sb = new StringBuilder("abcdefg012345");
sb.Insert(6, '-').Insert(2, '-').ToString();
答案 6 :(得分:0)
String s1 = "abcdefg012345";
String seperator = "-";
s1 = s1.Insert(2, seperator).Insert(6, seperator).Insert(9, seperator);
像这样链接它们可以减少你的行数。这是有效的,因为Insert方法返回带有提供的参数的字符串值s1,然后在返回的字符串上调用Insert函数,依此类推。
另外值得注意的是String是一个特殊的不可变类,因此每次为它设置一个值时,都会重新创建它。另外值得注意的是,String是一种特殊类型,允许您通过调用构造函数将其设置为新实例,上面的第一行将在语句标记中使用文本调用构造函数。
答案 7 :(得分:0)
仅仅为了完成并显示使用鲜为人知的Aggregate
函数,这里是另一个单行:
string result = new[] { 2, 5, 8, 15 }.Aggregate("abcdefg012345", (s, i) => s.Insert(i, "-"));
result
是ab-cd-ef-g01234-5。不过,我不会推荐这种变体。一见钟情就太难掌握了。
编辑:无论如何,此解决方案无效,因为“ - ”将插入已修改字符串的索引处,而不是插入到原始字符串的位置。但话说回来,这里的大多数答案都会遇到同样的问题。