我一直在寻找用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();
}
答案 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