日期:2014-05-17  浏览次数:20988 次

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);
------解决方案--------------------
引用:
只有加时间测试后才能确认

不过凭经验感觉后者更优

var tmp = p.usePropDic.Where(u => u.Value.systemPropId == propId); 遍历筛选了一次
tmp.Count() 统计了一次
level = tmp.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 都是非延迟操作符