【问题标题】:string.insert multiple values. Is this possible?string.insert 多个值。这可能吗?
【发布时间】:2012-02-28 15:15:43
【问题描述】:

我还在学习 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 行,而不必制作所有这些字符串。

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

【问题讨论】:

    标签: c# string insert


    【解决方案1】:

    无论您是否可以将其设为单线(您可以),由于.NET 中Stringimmutability,它总是会导致创建多个字符串

    如果您想在不创建多个字符串的情况下稍微有效地执行此操作,您可以使用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

    【讨论】:

    • 啊哈,我明白了,在那种情况下,我认为我能做的最好的事情就是按照 Ingenu 的方式:string S1 = "abcdefg012345".Insert(2, "-").Insert(6, "-")..... ;
    • posLookup 也可以创建为 new HashSet(positions) 作为稍微轻量级的解决方案。
    • @AndreLoker - 我喜欢这个想法(主要是因为你没有遇到ToDictionary 会遇到的重复密钥问题)。代码已更改。
    【解决方案2】:
    string S1 = "abcdefg012345".Insert(2, "-").Insert(6, "-")..... ;
    

    【讨论】:

    • 只想在每次插入之后添加,它从头开始计算索引,包括添加的字符。例如,第一次插入后,c 的索引将为 3。
    【解决方案3】:

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

    string strTarget = String.Format("abc{0}def{0}g012345","-");
    

    【讨论】:

    • 虽然这里的其他答案也可以解决问题,但这将是最有效的,因为它不会在每个步骤中创建额外的一次性字符串
    【解决方案4】:
    string s = "abcdefg012345";
    foreach (var index in [2, 6, ...]
    {
        s = s.Insert(index, "-");
    }
    

    【讨论】:

      【解决方案5】:

      我喜欢这个

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

      【讨论】:

        【解决方案6】:
                String s1 = "abcdefg012345";
                String seperator = "-";
                s1 = s1.Insert(2, seperator).Insert(6, seperator).Insert(9, seperator);
        

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

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

        【讨论】:

          【解决方案7】:

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

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

          result 是 ab-cd-ef-g01234-5。不过,我不会推荐这种变体。第一眼就很难掌握。

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-10-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-07-15
              • 2022-11-21
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多