1、 在C#中,我们时常需要缩减字符,并且用"..."取代被缩减的部分,通常我们使用的是(string).SubString()。
这样的写好处是比较容易想到,且简要易懂,便于编写。
这样写的不足是格式比较生硬,不便于复用,编写效率低。
2、 我在开发一些项目的时候,还经常有这样的需求:一个N长度的字符串,要取末尾的几个字符,或者中间指定起始和结尾的一段字符,其余的用"..."表示,这时候往往需要比较复杂的判断,最后用一个(string).SubString()。
下面我提供一种可以同时解决灵活性和繁琐判断的解决方案,希望可以抛砖引玉……
首先我们来看2个需要用到SubString()的地方:
1、 在C#中,我们时常需要缩减字符,并且用"..."取代被缩减的部分,通常我们使用的是(string).SubString(),然后我们可以这样缩减:

str =
(str.Length>10)? str.SubString(0,10)+"..." : str ;
这样的写好处是比较容易想到,且简要易懂,便于编写。
这样写的不足是格式比较生硬,不便于复用,编写效率低。
2、 我在开发一些项目的时候,还经常有这样的需求:一个N长度的字符串,要取末尾的几个字符,或者中间指定起始和结尾的一段字符,其余的用"..."表示,这时候往往需要比较复杂的判断,最后用一个(string).SubString()。
下面我提供一种可以同时解决灵活性和繁琐判断的解决方案,希望可以抛砖引玉:
1
/**//// <summary>
2
/// 区字符串固定长度,其余的省略
3
///
4
/// 规则:
5
/// 1.如果startIndex大于字符串长度,则自动调整到取最后maxLangth长度。如果此时maxLangth长度比字符串长度还要大,那么startIndex回到0
6
/// 2.如果在startIndex基础上,取maxLangth长度大于比字符串长度,那么maxLangth自动取到可能的最大值,即从startIndex一直取到字符串末尾
7
/// 3.结果中,字符串只要有削减的地方,都以".."替代
8
/// </summary>
9
/// <param name="str">原字符串</param>
10
/// <param name="startIndex">起始字符串位置</param>
11
/// <param name="maxLangth">最长字符个数</param>
12
/// <returns></returns>
13
public static string SubString(string str, int startIndex, int maxLangth)
14
{
15
string substring = "";
16
17
//调整startIndex
18
if (startIndex > str.Length - 1)//如果startIndex大于字符串长度
19
{
20
startIndex = (str.Length - maxLangth > 0) ? str.Length - maxLangth : 0;//则自动调整到取最后maxLangth长度。如果此时maxLangth长度比字符串长度还要大,那么startIndex回到0
21
}
22
23
//调整maxLangth
24
if (startIndex + maxLangth > str.Length)//如果在startIndex基础上,取maxLangth长度大于比字符串长度
25
{
26
maxLangth = str.Length - startIndex;//那么maxLangth自动取到可能的最大值,即从startIndex一直取到字符串末尾
27
}
28
//调整完成
29
30
//加缩略符号
31
substring += (startIndex > 0) ? ".." : "";//如果开头削减,以".."替代
32
33
//进行取定长字符串
34
substring += str.Substring(startIndex, maxLangth);
35
36
//加缩略符号
37
substring += (str.Length - startIndex - maxLangth > 0) ? ".." : "";//如果结尾削减,以".."替代
38
39
return substring;
40
}
41
你可以把这段程序放在一个单独的类库中,比如Common.StringHandle。由于采用了静态方式,你只需要这样直接调用:
str = Common.StringHandle.SubString(str , 7 , 8) ;
关于处理机制和参数说明,在编写的时候我已经说明的比较详细了,下面我居举一些简单的例子:
要求:字符串“0123456789”中,取前5个字符,其余用“..”替代
代码:Common.StringHandle.SubString("0123456789",0,5)
输出结果:01234..
要求:字符串“0123456789”中,取“5”开始的3字符(不足3个则全取),如果之后还有其余用“..”替代
代码:Common.StringHandle.SubString("0123456789",5,3)
输出结果:..567..
要求:字符串“0123456789”中,取“5”开始的10字符(不足10个则全取),如果之后还有其余用“..”替代
代码:Common.StringHandle.SubString("0123456789",5,10)
输出结果:..56789
我在这也只是给出一种思路,这段代码还有很多的扩展余地:比如约定".."的形式、实现从右截取N个字符,或者在.net3.5中使用扩展方法(Extension Method)来完成等等(有些我已经实现,但由于加进来可能冲淡主题了,在此省略,不过我们可以例外探讨)。
希望可以抛砖引玉,跟大家一起探讨!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异