【问题标题】:C# Concatenate strings or array of charsC# 连接字符串或字符数组
【发布时间】:2015-09-14 11:51:16
【问题描述】:

我在开发应用程序时遇到问题。 基本上, 我有一个固定的字符串,比如说“IHaveADream”

我现在想要用户插入另一个字符串,以达到固定长度的目的,然后将固定字符串的每个字符与用户插入的字符串的每个字符连接起来。 例如 用户插入“ByeBye” 那么输出将是: “IBHyaevBeyAeDream”。

如何做到这一点?

我在 for 语句中尝试过使用 String.Concat 和 String.Join,但没有成功。

【问题讨论】:

    标签: c# arrays string concatenation


    【解决方案1】:

    一个节省内存的选项是使用字符串生成器,因为原始字符串和用户输入都可能相当大。正如 Kris 所提到的,您可以将 StringBuilder 容量初始化为两个字符串的组合长度。

    void Main()
    {
        var start = "IHaveADream";
        var input = "ByeBye";
    
        var sb = new StringBuilder(start.Length + input.Length);
    
        for (int i = 0; i < start.Length; i++)
        {
            sb.Append(start[i]);
    
            if (input.Length >= i + 1)
                sb.Append(input[i]);
        }
    
        sb.ToString().Dump();
    }
    

    这只安全地解释了输入字符串的长度小于或等于起始字符串的长度。如果您有一个较长的输入字符串,您可能希望将较长的长度作为 for 循环迭代的终点,并检查每个数组索引是否超出范围。

    void Main()
    {
        var start = "IHaveADream";
        var input = "ByeByeByeByeBye";
    
        var sb = new StringBuilder(start.Length + input.Length);
    
        var length = start.Length >= input.Length ? start.Length : input.Length;
        for (int i = 0; i < length; i++)
        {
            if (start.Length >= i + 1)
                sb.Append(start[i]);
    
            if (input.Length >= i + 1)
                sb.Append(input[i]);
        }
    
        sb.ToString().Dump();
    }
    

    【讨论】:

    • 由于您使用内存效率作为使用 StringBuilder 的参数,因此请构造一个初始容量等于输出长度的 StringBuilder。
    • @KrisVandermotten 好点。我已更新我的答案以反映您的评论。
    【解决方案2】:

    您可以按您想要的顺序创建array of characters,然后创建re-combine them

    char[] chars1 = "IHaveADream".ToCharArray();
    char[] chars2 = "ByeBye".ToCharArray();
    
    // you can create a custom algorithm to handle 
    // different size strings.
    char[] c = new char[17];
    c[0] = chars1[0];
    c[1] = chars2[0];
    ...
    c[13] = chars1[10];
    
    string s = new string(c);
    

    【讨论】:

      【解决方案3】:
      var firstString = "Ihaveadream";
      var secondString = "ByeBye";
      var stringBuilder = new StringBuilder();
      for (int i = 0; i< firstString.Length; i++) {
                 stringBuilder .Append(str[i]);
                 if (i < secondString.Length) {
                 stringBuilder .Append(secondStr[i]);
                 }
      }
      
      var result = stringBuilder.ToString();
      

      【讨论】:

        【解决方案4】:

        如果您不太关心内存使用或性能,您可以使用:

            public static string concatStrings(string value, string value2)
            {
                string result = "";
                int i = 0;
        
                for (i = 0; i < Math.Max(value.Length, value2.Length) ; i++)
                {
                    if (i < value.Length) result += value[i].ToString();
                    if (i < value2.Length) result += value2[i].ToString();
                }
        
                return result;
            }
        

        用法:

                string conststr = "IHaveADream";
                string input = "ByeBye";
                var result = ConcatStrings(conststr, input);
        
                Console.WriteLine(result);
        

        输出:IBHyaevBeyAeDream

        附: 刚刚检查了这两种方法的性能(使用 strBuilder 和简单的连接),看起来这两种方法都需要相同的时间来执行(如果你只有一个操作)。主要原因是字符串生成器需要相当长的时间来初始化,而使用连接我们不需要。

        但是,如果您必须处理 1500 个字符串之类的内容,那就另当别论了,字符串生成器是一种更好的选择。

        对于 100 000 次方法执行,它分别显示 85 (str buld) 和 22 (concat) ms。

        My Code

        【讨论】:

        • 我觉得这里的输出不正确,是IBHyaevBeyAe而不是IBHyaevBeyAeDream
        猜你喜欢
        • 2023-04-02
        • 1970-01-01
        • 2016-03-02
        • 2018-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 1970-01-01
        相关资源
        最近更新 更多