C#避坑ToLower和ToUpper,小心把你的系统给拖垮了
玩转GitHub
共 1619字,需浏览 4分钟
·
2023-11-11 08:49
不知道何时开始,很多程序员喜欢用ToLower,ToUpper去实现忽略大小写模式的字符串相等性比较,有可能这个习惯是从别的语言引进的,大胆猜测下是JS,为了不引起争论,我指的JS是技师的意思~
1. 讲故事
在我们一个订单聚合系统中,每一笔订单都会标注来源,比如JD,Taobao,Etao,Shopex 等等一些渠道,UI上也提供高级配置输入自定义的订单来源,后来客户反馈输入xxx查询不出订单,这里就拿shopex为例,用户用小写的shopex查询,但系统中标注的是首字母大写的Shopex,所以自然无法匹配,为了解决这个问题开发小哥就统一转成大写做比对,用代码表示如下:
var orderfrom = "shopex".ToUpper();
customerIDList = MemoryOrders.Where(i =>i.OrderFrom.ToUpper()==orderFrom)
.Select(i => i.CustomerId).ToList();
改完后就是这么牛的上线了,乍一看也没啥问题,结果一查询明显感觉比之前速度慢了好几秒,干脆多点几下,好咯。。。在监控中发现CPU和memory突高突低,异常波动,这位小哥又在写bug了,查了下代码问他为什么这么写,小哥说在js中就是这么比较的~~~
2. string.Compare 改造
其实在C#中面对忽略大小写形式的比较是有专门的方法,性能高而且还不费内存,它就是 string.Compare,所以把上面代码改成如下就可以了。
var orderfrom = "shopex";
customerIDList = MemoryOrders.Where(string.Compare(i.TradeFrom, tradefrom,StringComparison.OrdinalIgnoreCase) == 0)
.Select(i => i.CustomerId).ToList();
这其中的 StringComparison.OrdinalIgnoreCase枚举就是用来忽略大小写的,上线之后除了CPU还是有点波动,其他都没有问题了。
原文:
https://www.cnblogs.com/huangxincheng/archive/2020/05/04/12827314.html
评论