linq 效率问题
// 一
int level = 0;
var tmp = p.usePropDic.Where(u => u.Value.systemPropId == propId);
if (tmp.Count() != 0) level = tmp.Max(o => o.Value.level);
// 二
int level = 0;
foreach (KeyValuePair<int, UseProp> u in p.usePropDic)
{
if (u.Value.systemPropId == propId && level < u.Value.level)
level = u.Value.level;
}
都是赋值给level,哪个效率高?
------解决方案--------------------我个人觉得是第一种效率高,直接有条件就可以搞定,而第二种还的去循环找到之后才能拿到值
------解决方案--------------------加个时间就知道,谁快谁慢了啊。我跟人支持 第二种。linq 归根结底,就是循环
------解决方案--------------------只有加时间测试后才能确认
不过凭经验感觉后者更优
var tmp = p.usePropDic.Where(u => u.Value.systemPropId == propId); 遍历筛选了一次
tmp.Count() 统计了一次
level = tmp.Max(o => o.Value.level); 在筛选后的集合中又遍历一次取最大值
------解决方案--------------------第一种可以直接写成一句,没有必要去做Count这个判断
p.usePropDic.Where(u => u.Value.systemPropId == propId).Max(o => o.Value.level);
------解决方案--------------------
Where是延迟加载的
也就是说到Count()这里才会真正去查询并返回数量,就LZ这个需求完全一句就可以搞掂
int level = p.usePropDic.Where(u => u.Value.systemPropId == propId).Max(o => o.Value.level);
这正是Linq的一大优势,编译器会进一步进行优化的,性能相信差不了
相比Linq带来的可读性以及开发效率有时候显得要重要得多
------解决方案--------------------Count MAX 都是非延迟操作符