任何人都可以想出更好的方法来做到以下几点:
public string ShortDescription
{
get { return this.Description.Length <= 25 ? this.Description : this.Description.Substring(0, 25) + "..."; }
}
我本来想做string.Substring(0,25),但如果字符串小于提供的长度,它会抛出异常。
答案 0 :(得分:28)
我经常需要这个,我为它写了一个扩展方法:
public static class StringExtensions
{
public static string SafeSubstring(this string input, int startIndex, int length, string suffix)
{
// Todo: Check that startIndex + length does not cause an arithmetic overflow - not that this is likely, but still...
if (input.Length >= (startIndex + length))
{
if (suffix == null) suffix = string.Empty;
return input.Substring(startIndex, length) + suffix;
}
else
{
if (input.Length > startIndex)
{
return input.Substring(startIndex);
}
else
{
return string.Empty;
}
}
}
}
如果你只需要一次,那就太过分了,但是如果你需要它更频繁,那么它就会派上用场。
编辑:添加了对字符串后缀的支持。传入“...”,你可以在较短的字符串上得到你的省略号,或者传入string.Empty,没有特殊的后缀。
答案 1 :(得分:23)
return this.Description.Substring(0, Math.Min(this.Description.Length, 25));
没有...
部分。实际上,你的方式可能是最好的。
答案 2 :(得分:11)
public static Take(this string s, int i)
{
if(s.Length <= i)
return s
else
return s.Substring(0, i) + "..."
}
public string ShortDescription
{
get { return this.Description.Take(25); }
}
答案 3 :(得分:6)
你做的方式对我来说似乎很好,除了我会使用幻数25,我将它作为常数。
你真的想把它存放在你的豆子里吗?大概这是显示在某处,所以你的渲染器应该是截断而不是数据对象的东西
答案 4 :(得分:4)
嗯,我知道已经接受了答案,我可能会因为在这里抛出一个正则表达而被钉死在十字架上,但这就是我通常做的事情:
//may return more than 25 characters depending on where in the string 25 characters is at
public string ShortDescription(string val)
{
return Regex.Replace(val, @"(.{25})[^\s]*.*","$1...");
}
// stricter version that only returns 25 characters, plus 3 for ...
public string ShortDescriptionStrict(string val)
{
return Regex.Replace(val, @"(.{25}).*","$1...");
}
它有一个很好的附带好处,即不会将一个单词切成两半,因为它总是在第一个空白字符超过25个字符后停止。 (当然,如果你需要它来截断进入数据库的文本,那可能是个问题。
下行,我确信这不是最快的解决方案。
编辑:已替换为“...”因为不确定此解决方案是否适用于网络!
答案 5 :(得分:3)
没有....这应该是最短的:
public string ShortDescription
{
get { return Microsoft.VisualBasic.Left(this.Description;}
}
答案 6 :(得分:1)
我认为这种方法很合理,但我建议进行一些调整
const
或配置值if
条件而不是三元运算符string.Format("{0}...")
而不是+ "..."
所以:
public string ShortDescription
{
get
{
const int SHORT_DESCRIPTION_LENGTH = 25;
string _shortDescription = Description;
if (Description.Length > SHORT_DESCRIPTION_LENGTH)
{
_shortDescription = string.Format("{0}...", Description.Substring(0, SHORT_DESCRIPTION_LENGTH));
}
return _shortDescription;
}
}
对于更通用的方法,您可能希望将逻辑移动到扩展方法:
public static string ToTruncated(this string s, int truncateAt)
{
string truncated = s;
if (s.Length > truncateAt)
{
truncated = string.Format("{0}...", s.Substring(0, truncateAt));
}
return truncated;
}
我广泛使用三元运算符,但如果代码变得足够冗长以至于它开始超过120个字符左右,则更愿意避免使用它。在这种情况下,我想将它包装到多行,所以发现常规的if
条件更具可读性。
对于印刷正确性,您还可以考虑使用省略号字符(...)而不是三个点/句点/句号(...)。
答案 7 :(得分:1)
一种方法:
int length = Math.Min(Description.Length, 25);
return Description.Substring(0, length) + "...";
有两行而不是一行,但是较短的一行:)。
编辑: 正如评论中所指出的,这会让你一直......所以答案是错误的。纠正它意味着我们回到最初的解决方案。
此时,我认为使用字符串扩展是缩短代码的唯一选择。只有当代码在至少几个地方重复时才有意义......
答案 8 :(得分:0)
对我来说很好看,真的很挑剔我会用实体引用"…"
替换“...”
答案 9 :(得分:0)
我想不出任何,但你的方法可能不是最好的。您是否在数据对象中添加了表示逻辑?如果是这样,那么我建议你把这个逻辑放在别处,例如一个带有GetShortStringMethod的静态StringDisplayUtils类(int maxCharsToDisplay,string stringToShorten)。
然而,这种方法也许不是很好。不同的字体和字符集怎么样?您必须以像素为单位开始测量实际的字符串长度。查看winform的Label类上的AutoEllipsis属性(如果使用此项,您将需要将AutoSize设置为false)。 AutoEllipsis属性,如果为true,将缩短字符串并为您添加“...”字符。
答案 10 :(得分:0)
我会坚持你所拥有的东西,但作为替代方案,如果你有LINQ对象,你可以
new string(this.Description.ToCharArray().Take(25).ToArray())
//And to maintain the ...
+ (this.Description.Length <= 25 ? String.Empty : "...")
正如其他人所说,你可能想要将25存储在一个
中答案 11 :(得分:0)
您应该看看是否可以将Microsoft.VisualBasic DLL引用到您的应用程序中,以便您可以使用“左”功能。