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

时间:2012-02-28 15:15:44

标签: c# 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行,而不必制作所有这些字符串。

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

8 个答案:

答案 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 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, '-');

答案 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。不过,我不会推荐这种变体。一见钟情就太难掌握了。

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