【问题标题】:Break string into separate lines: a showdown将字符串分成单独的行:摊牌
【发布时间】:2010-12-06 09:37:37
【问题描述】:

容纳专门为它们所代表的 IBM 大型机屏幕设计的遗留数据库表让我非常恼火。通常,我发现需要将字符串分成多行以适应表格列宽以及仍在使用终端模拟器查看数据的用户。这是我为执行该任务而编写的两个函数,接受字符串和线宽作为参数并返回一些可枚举的字符串。您认为哪个功能更好,为什么?并通过各种方式分享我完全忽略的超级简单快速高效的方式。

  public string[] BreakStringIntoArray(string s, int lineWidth)
  {
   int lineCount = ((s.Length + lineWidth) - 1) / lineWidth;
   string[] strArray = new string[lineCount];
   for (int i = 0; i <= lineCount - 1; i++)
   {
    if (((i * lineWidth) + lineWidth) >= s.Length)
     strArray[i] = s.Substring(i * lineWidth);
    else
     strArray[i] = s.Substring(i * lineWidth, lineWidth);
   }
   return strArray;
  }

对比

  public List<string> BreakStringIntoList(string s, int lineWidth)
  {
   List<string> lines = new List<string>();
   if (s.Length > lineWidth)
   {
    lines.Add(s.Substring(0, lineWidth));
    lines.AddRange(this.BreakStringIntoList(s.Substring(lineWidth), lineWidth));
   }
   else
   {
    lines.Add(s);
   }
   return lines;
  }

例如,传入 ("Hello world", 5) 将返回 3 个字符串:

"Hello"
" worl"
"d"

【问题讨论】:

    标签: c# .net string recursion


    【解决方案1】:

    我喜欢 Itay 的解决方案,但它没有产生正确的输出,所以这是我编辑的版本。

    protected void Page_Load(object sender, EventArgs e)
    {
        string a = "12345678901234567890123456789012345";
        TextBox1.Text = a;
        TextBox2.Text = BreakStringIntoLinesVer2(a, 10);
    
    }
    
    string BreakStringIntoLinesVer2(string s, int lineWidth)
    {
        StringBuilder sb = new StringBuilder(s);
        int last = (sb.Length % lineWidth == 0) ? sb.Length - lineWidth : sb.Length - (sb.Length % lineWidth);
    
        for (int i = last; i > 0; i -= lineWidth)
        {
            sb.Insert(i, Environment.NewLine);
        }
        return sb.ToString();
    }
    

    【讨论】:

      【解决方案2】:

      编辑:对不起,我以为你想要一个字符串分成几行^__^"

      取决于字符串的长度.. 但对于长的:

          string BreakStringIntoLines(string s, int lineWidth)
          {
              StringBuilder sb = new StringBuilder(s);
              for (int i = lineWidth; i < sb.Length; i += lineWidth)
              {
                  sb.Insert(i, Environment.NewLine);
              }
              return sb.ToString();
          }
      

      【讨论】:

        【解决方案3】:
        Regex.Replace(input, ".{5}", x => x.Value + "\n").Split(new char [] {'\n'})
        

        【讨论】:

          【解决方案4】:

          第一个更好。

          第二个会产生大量临时对象,如果你可以预先确定目标行的数量,这是完全没有必要的。

          还有一些被忽略的东西:根据速度要求,您可能会使用指针来获得相当大的加速(取决于您实际想要对结果做什么)。但这将比现在复杂得多。

          只是为了量化“大量临时对象”。如果您有一个 1MB 的字符串(最坏情况下的行长度为 1),第一种方法需要 1MB 的字符串内容内存分配。第二个需要 500GB 的字符串内容内存分配。

          【讨论】:

          • 出色的分析。我自己的测试表明,虽然 100 个字符的短字符串从任一函数运行的速度大致相同(几乎立即在我的机器上),但更长的字符串证明数组方法速度更快,内存效率更高。
          【解决方案5】:
          public List<string> BreakStringIntoLines(string s, int lineWidth)
          {
               string working = s;
               List<string> result = new List<string>(Math.Ceil((double)s.Length / lineWidth));
               while (working.Length > lineWidth)
               {
                    result.add(working.Substring(0, lineWidth);
                    working = working.Substring(5);
               }
          
               result.Add(working);
          
               return result;
          }
          

          这可能是我会做的。恕我直言,列表比字符串数组更灵活。

          另外,我会避免像瘟疫一样的递归。创建和调试使用简单循环的东西要容易得多。

          【讨论】:

          • 工作 = working.Substring(5);继续创建字符串实例..我会避免这种情况..
          猜你喜欢
          • 2014-08-22
          • 2022-01-19
          • 1970-01-01
          • 2020-07-30
          • 2014-08-22
          • 1970-01-01
          • 2019-03-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多