我正在尝试构建一个字符串扩展方法来将字符串修剪为一定长度,但不会破坏单词.我想检查框架中是否有任何内置或者比我更聪明的方法.到目前为止这是我的(未经过彻底测试):
public static string SmartTrim(this string s, int length)
{
StringBuilder result = new StringBuilder();
if (length >= 0)
{
if (s.IndexOf(' ') > 0)
{
string[] words = s.Split(' ');
int index = 0;
while (index < words.Length - 1 && result.Length + words[index + 1].Length <= length)
{
result.Append(words[index]);
result.Append(" ");
index++;
}
if (result.Length > 0)
{
result.Remove(result.Length - 1, 1);
}
}
else
{
result.Append(s.Substring(0, length));
}
}
else
{
throw new ArgumentOutOfRangeException("length", "Value cannot be negative.");
}
return result.ToString();
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 14
我会用string.LastIndexOf
- 至少我们只关心空间.然后就没有必要创建任何中间字符串......
尚未经过测试:
public static string SmartTrim(this string text, int length)
{
if (text == null)
{
throw new ArgumentNullException("text");
}
if (length < 0)
{
throw new ArgumentOutOfRangeException();
}
if (text.Length <= length)
{
return text;
}
int lastSpaceBeforeMax = text.LastIndexOf(' ', length);
if (lastSpaceBeforeMax == -1)
{
// Perhaps define a strategy here? Could return empty string,
// or the original
throw new ArgumentException("Unable to trim word");
}
return text.Substring(0, lastSpaceBeforeMax);
}
Run Code Online (Sandbox Code Playgroud)
测试代码:
public class Test
{
static void Main()
{
Console.WriteLine("'{0}'", "foo bar baz".SmartTrim(20));
Console.WriteLine("'{0}'", "foo bar baz".SmartTrim(3));
Console.WriteLine("'{0}'", "foo bar baz".SmartTrim(4));
Console.WriteLine("'{0}'", "foo bar baz".SmartTrim(5));
Console.WriteLine("'{0}'", "foo bar baz".SmartTrim(7));
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
'foo bar baz'
'foo'
'foo'
'foo'
'foo bar'
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2900 次 |
最近记录: |