C# 中如何使用LINQ移除字符串末尾的指定字符
现有实现正确性判断
你的代码不符合「仅移除字符串末尾点号」的需求:
Trim('.')会同时移除字符串首尾两端所有连续的点号,例如原始值为.demo.site.时,处理后的结果是demo.site,开头的点号也会被误删,和你的预期不符。- 如果你使用EF/EF Core等ORM框架操作数据库,还要注意
Trim('.')能否被正确翻译成对应数据库的SQL函数,若翻译失败会触发客户端求值,数据量大时会出现明显的性能损耗。
更优实现方案
方案1:LINQ to Objects 内存查询场景
如果你是操作内存中的集合,直接使用TrimEnd('.')即可,该方法只会移除末尾所有连续的点号,不会修改字符串开头和中间的内容:
var hatoList = (from L in db.vHatoList select L.HatoFullName.TrimEnd('.')).ToList();
如果你的需求是仅移除末尾单个点号,不是所有连续的末尾点号,可以使用以下逻辑:
var hatoList = db.vHatoList.Select(L => L.HatoFullName.EndsWith('.') ? L.HatoFullName[..^1] : L.HatoFullName ).ToList();
上述语法使用了C# 8.0及以上版本支持的范围运算符,低版本可以替换为Substring(0, L.HatoFullName.Length - 1)。
方案2:ORM 数据库查询场景
主流EF Core 3.0+版本已经支持TrimEnd函数对SqlServer、MySQL、PostgreSQL等数据库的SQL翻译,可以直接使用方案1的写法。
如果你使用的ORM版本不支持TrimEnd翻译,小数据量场景下可以先拉取原始字段到内存再处理:
var hatoList = db.vHatoList.Select(L => L.HatoFullName) .AsEnumerable() .Select(s => s.TrimEnd('.')) .ToList();
如果数据量较大,建议直接在查询中使用数据库原生函数实现,例如SQL Server中可以用RIGHT函数判断末尾字符后截取。
内容的提问来源于stack exchange,提问作者Nuzheen Kazim
相关产品推荐
相关产品推荐

