2013-02-15 65 views
0

只是想知道哪种方法更快,更好的使用或做你喜欢LINQ的任何()VS的foreach

bool userHavePermission = user.Permissions.Any(x => x.UpperName == "ADMINISTRATOR"); 

foreach (Permission p in _Permissions) 
{ 
    if (p.UpperName == name.ToUpper()) 
     return true; 
} 
return false; 

感谢

+1

有效,它是相同的代码;任何''遍历'IEnumerable'应用谓词,在第一次匹配时返回true(并停止迭代)。也就是说,我会选择'Any',因为它非常清楚代码要做什么。 – JerKimball 2013-02-15 22:09:35

+3

您是否尝试过比较得到的IL代码?或者,如果不同,最终的jitter代码? – 2013-02-15 22:09:39

+0

这个问题完全是主观的,而不是建设性的,这使得它不适用于SO。 – Servy 2013-02-15 22:12:48

回答

4

这几乎是相同的代码时,唯一不同的是,如果name变量为null,那么在第二个代码片段中,您将在运行时获得NullReferenceException,因为您将调用01空实例上的方法。第一个看起来更短,更安全,更可读,这就是我会用的。并保证不会有任何的NRE:

return user 
    .Permissions 
    .Any(x => string.Equals(x.UpperName, name, StringComparison.OrdinalIgnoreCase)); 
0

使用任何是更好的方法,因为它是一条线。它读取更容易,占用更少的空间。

此外,它不清楚Permissions对象是什么,但如果它是一个代表数据库表的Somekind的实体,那么Any更好,因为您只返回查询的结果,其中foreach将解析整个权限列表在迭代开始之前。