Ars*_*had 5 .net c# string substring winforms
我有一个label控制权windows form.我想在中显示全文label.条件是这样的:
如果可能的话,用完整的单词分割,不带连字符( - ).
到目前为止,我已达到以下代码:
private void Form1_Load(object sender, EventArgs e)
{
string strtext = "This is a very long text. this will come in one line.This is a very long text. this will come in one line.";
if (strtext.Length > 32)
{
IEnumerable<string> strEnum = Split(strtext, 32);
label1.Text =string.Join("-\n", strEnum);
}
}
static IEnumerable<string> Split(string str, int chunkSize)
{
return Enumerable.Range(0, str.Length / chunkSize)
.Select(i => str.Substring(i * chunkSize, chunkSize));
}
Run Code Online (Sandbox Code Playgroud)但问题是最后一行没有完全显示,因为它分裂了32个字符.
还有另一种方法来实现这一目标吗?
我不知道您是否会接受不使用 linq 的答案,但这很简单:
string SplitOnWholeWord(string toSplit, int maxLineLength)
{
StringBuilder sb = new StringBuilder();
string[] parts = toSplit.Split();
string line = string.Empty;
foreach(string s in parts)
{
if(s.Length > 32)
{
string p = s;
while(p.Length > 32)
{
int addedChars = 32 - line.Length;
line = string.Join(" ", line, p.Substring(0, addedChars));
sb.AppendLine(line);
p = p.Substring(addedChars);
line = string.Empty;
}
line = p;
}
else
{
if(line.Length + s.Length > maxLineLength)
{
sb.AppendLine(line);
line = string.Empty;
}
line = (line.Length > 0 ? string.Join(" ", line, s) : s);
}
}
sb.Append(line.Trim());
return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)
致电
string result = SplitOnWholeWord(strtext, 32);
Run Code Online (Sandbox Code Playgroud)
可以轻松地将其转换为扩展方法:
将上面的代码放在一个单独的文件中并创建一个静态类
public static class StringExtensions
{
public static string SplitOnWholeWord(this string toSplit, int maxLineLength)
{
// same code as above.....
}
}
Run Code Online (Sandbox Code Playgroud)
并以这种方式调用它:
string result = strtext.SplitOnWholeWord(32);
Run Code Online (Sandbox Code Playgroud)