c#自动换行,如何根据字符串中的不同单词限制新行的创建

时间:2016-05-16 10:16:05

标签: c# console-application word-wrap

我一直在寻找用C#编写自动换行控制台应用程序。我在这里找到了很多有用的例子,但我现在遇到了一些问题。

我目前获得的代码将在“溢出”columnLimit的每个单词后创建一个新行。我想/需要一种方法来添加一个新行,只有当该单词不是字符串中的最后一行时,并且如果可能在两行之间的单词溢出时添加一个连字符(所以它将是分词器不是单词包装器。)

我知道这可能是一个非常简单的解决方案,但我是C#的新手,我真的很难解决这个问题。一个编码解决方案,所以我可以看到我出错的地方将是理想的。

任何人都可以帮我吗?

public string formatText(string longSentence, int columnLimit)
{
    string[] words = longSentence.Split(' ');
    StringBuilder newLongSentence = new StringBuilder();
    string line = "";

    foreach (string word in words)
    {
        if ((line + word).Length > columnLimit)
        {
            newLongSentence.AppendLine(line);
            line = "";
        }

        line += string.Format("{0} ", word);
    }

    if (line.Length > 0) 
        newLongSentence.AppendLine(line);

    return newLongSentence.ToString();     
}

2 个答案:

答案 0 :(得分:1)

你应该使用线超过限制的长度来做一个子串,使你的foreach循环看起来更像这样

foreach (string word in words)
{
    int extraLetters = columnLimit - (line + word).Length;
    if (extraLetters < 0 && extraLetters != word.Length)
    {

        newLongSentence.AppendLine(line + word.Substring(0, word.length + extraLetters));
        line = string.Format("{0} ", word.Substring(word.length + extraLetters + 1));

    }
    else if(extraLetters == word.Length)
    {
        newLongSentence.AppendLine(line);
        line = String.Format("{0} ", word);
    }
    else
    {
        line += string.Format("{0} ", word);
    }

}

如果您希望包含短划线,请从相关的子串中取1,然后添加一个破折号

foreach (string word in words)
{
    int extraLetters = columnLimit - (line + word).Length;
    if (extraLetters < 0 && extraLetters != word.Length && extraLetters != word.Length - 1)
    {

        newLongSentence.AppendLine(line + word.Substring(0, word.length + extraLetters - 1) + "-");
        line = string.Format("{0} ", word.Substring(word.length + extraLetters));

    }
    else if(extraLetters == word.Length || extraLetters == word.Length - 1)
    {
        newLongSentence.AppendLine(line);
        line = String.Format("{0} ", word);
    }
    else
    {
        line += string.Format("{0} ", word);
    }

}

答案 1 :(得分:0)

试试这个

<Column.CellTemplate>
   <DataTemplate>
      <Grid x:Name="Container">
      ......
      </Grid>
      <DataTemplate.Triggers>
         <DataTrigger Binding="{Binding Path=IsReserved}" Value="True">
             <Setter Property="Background" Value="Orange" TargetName="Container" />
         </DataTrigger>
      <DataTemplate.Triggers>
   </DataTemplate>
</Column.CellTemplate>

如果 public string formatText(string textData) { textData = new Regex(@" {2,}").Replace(textData.Trim(), @" "); var left = Console.CursorLeft; var top = Console.CursorTop; var lines = new List<string>(); for (var i = 0; textData.Length > 0; i++) { lines.Add(textData.Substring(0, Math.Min(Console.WindowWidth, textData.Length))); var length = lines[i].LastIndexOf(" ", StringComparison.Ordinal); if (length > 0) lines[i] = lines[i].Remove(length); textData = textData.Substring(Math.Min(lines[i].Length + 1, textData.Length)); Console.SetCursorPosition(left, top + i); Console.WriteLine(lines[i]); } } 很重要,那么以下内容可能会对您有所帮助

columnLimit