将字符串分成不同的行:摊牌

时间:2009-10-13 16:57:01

标签: c# .net string recursion

适应专为其所代表的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;
  }

VS

  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"

5 个答案:

答案 0 :(得分:0)

第一个更好。

如果你可以预先确定目标线的数量,那么第二个就会产生大量的临时物体。

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

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

答案 1 :(得分:0)

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;
}

这可能就是我的意思。 List比字符串数组IMHO更灵活。

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

答案 2 :(得分:0)

Regex.Replace(input, ".{5}", x => x.Value + "\n").Split(new char [] {'\n'})

答案 3 :(得分:0)

编辑:抱歉,我以为你想要一个字符串分成行^ __ ^“

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

    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();
    }

答案 4 :(得分:0)

我喜欢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();
}