字符串.插入多个值.这可能吗

本文关键字:插入 字符串 | 更新日期: 2023-09-27 18:25:59

我仍在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<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"

现场示例: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, "-"));

CCD_ 7为ab-cd-ef-g01234-5。不过,我不推荐这种变体。乍一看太难把握了。

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

在这种情况下,您应该使用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, '-');