我想截断一个字符串,使其长度不超过给定值 . 我正在写一个数据库表,并希望确保我写的值符合列的数据类型的约束 .
例如,如果我能写下面的内容会很好:
string NormalizeLength(string value, int maxLength)
{
return value.Substring(0, maxLength);
}
不幸的是,这引发了异常,因为 maxLength
通常超出了字符串 value
的边界 . 当然,我可以编写如下的函数,但我希望这样的东西已经存在 .
string NormalizeLength(string value, int maxLength)
{
return value.Length <= maxLength ? value : value.Substring(0, maxLength);
}
执行此任务的难以捉摸的API在哪里?有吗?
28 回答
这是我经常使用的代码:
There isn't a Truncate() method on string, unfortunately. 你必须自己写这种逻辑 . 但是,你可以做的是将它包装在扩展方法中,这样你就不必在任何地方复制它:
现在我们可以写:
或者代替三元运算符,您可以使用Math.min
我想我会抛弃我的实现,因为我相信它涵盖了其他人已经触及的所有案例,并且以简洁的方式这样做仍然可读 .
这个解决方案主要 Build 在Ray's solution之上,并通过在他的解决方案中使用this关键字LBushkin does打开了用作扩展方法的方法 .
您可以使用LINQ ...它消除了检查字符串长度的需要 . 不可否认,也许不是最有效的,但它很有趣 .
要么
在.NET 4.0中,您可以使用
Take
方法:没有测试效率!
因为性能测试很有趣:(使用linqpad extension methods)
truncate
方法更快"significantly" . #microoptimization早
晚了
太长
.NET Framework有一个API来截断这样的字符串:
但是在C#应用程序中,你可能更喜欢自己动手而不是依赖于Microsoft.VisualBasic.dll,它的主要存在是向后兼容性 .
似乎还没有人发布这个:
使用&&运算符使其略微优于接受的答案 .
我在一条线上做了这样的事情
与C#6的Null传播算子类似的变体
请注意,我们基本上检查
value
在此处是否为空两次 .以@CaffGeek为例,简化它:
Kndly注意到截断字符串不仅仅意味着仅仅按指定长度剪切字符串,而是必须注意不要分割字 .
例如string:这是一个测试字符串 .
我想在11点削减它 . 如果我们使用上面给出的任何方法,结果将是
this is a te
这不是我们想要的
我使用的方法也可能不是那么完美,但它可以处理大多数情况
我知道这是一个老问题,但这是一个很好的解决方案:
返回:你好......
2016年C#字符串仍然没有Truncate方法 . 但是 - 使用C#6.0语法:
它就像一个魅力:
万一这里的答案不够,这里是我的:)
使用:
为什么不:
即在事件
value.Length < maxLength
垫空间到最后或截断多余 .为了(过度)复杂性,我将添加我的重载版本,该版本用maxLength参数的省略号替换最后3个字符 .
我更喜欢jpierson的答案,但我在这里看到的所有示例都没有处理无效的maxLength参数,例如当maxLength <0时 .
选择是在try / catch中处理错误,将maxLength参数min钳位到0,或者如果maxLength小于0则返回空字符串 .
没有优化的代码:
这里有一个vb.net解决方案,标记if(虽然丑陋)语句提高了性能,因为当string已经小于maxlength时我们不需要substring语句...通过使它成为字符串的扩展它很容易使用...
我知道已经有很多答案,但我的需要是保持字符串的开头和结尾完整但缩短到最大长度 .
这用于创建最大长度为260个字符的SharePoint URL .
我没有使长度成为参数,因为它是常量260.我也没有将第一个子串长度作为参数,因为我希望它在特定点处中断 . 最后,第二个子串是源的长度 - 20,因为我知道文件夹结构 .
这可以很容易地适应您的特定需求 .
TruncateString
我知道这里已经有很多答案了,但这是我用过的那个,它处理空字符串和传入的长度为负的情况:
作为上述讨论的可能性的补充,我想分享我的解决方案 . 它是一个允许null(返回string.Empty)的扩展方法,还有第二个.Truncate()用于使用省略号 . 请注意,它不是性能优化的 .
在我所知道的.net中没有任何内容 - 这是我的版本添加了“......”:
我建议使用substring方法获得相同的有效功能 .
这样做的好处是可以让你从任何一边或甚至中间的某个地方拼接你的字符串,而无需编写其他方法 . 希望有所帮助:)
供其他参考:https://www.dotnetperls.com/substring
截断字符串