2013-02-15 45 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將解析整個權限列表在迭代開始之前。