2013-07-17 50 views
2

您好我有以下代碼:LINQ和ReSharper的

if (!_jobs.Any(j => j.Id == emailJob.Id)) 
{ 
} 

此代碼應該找到滿足條件的任何元素。所以,我認爲它應該找到的第一個元素,這樣的事情後返回:

if (!_jobs.FirstOrDefault(j => j.Id == emailJob.Id) != null) 
{ 
} 

ReSharper的嘗試這個LINQ表達式簡化爲:

if (_jobs.All(j => j.Id != emailJob.Id)) 
{ 
} 

這似乎效率不高我,因爲它有檢查每一個元素是否滿足逆向條件。

對不起,如果我只是誤解LINQ的工作原理。

Joe

+0

這取決於,真的。 –

+0

你必須檢查整個列表,如果它們全都與那個ID不同。即使在第一個例子中。 –

+1

當抽屜裏還有一隻襪子還沒有看過時,你怎麼能告訴那個人X沒有任何紅色的襪子? –

回答

3

AnyAll都將立即停止查找條件失敗。

如果您正在尋找的不僅僅是聽取我們的詞彙或軼事證據,您可以從源頭上看到它正在做的是什麼。

Decompiled Any and All methods

施加謂詞後有一個在All方法額外的反轉。這是一個相對0的性能影響,所以代碼可讀性是主要關心的問題。

+0

我明白了 - 我應該真的意識到這一點,不知道今天我有什麼問題。謝謝。 – JoeS

7

這兩個版本是鏡像方法,可以完成相同數量的工作。

當你說:「如果沒有項目滿足這個條件」(!Any),然後該項目的所有有爲了得到一個明確的答案進行檢查。

ReSharper的建議很有用,因爲它指導您使用更清楚地顯示將要發生的事情的方法:All工作將不得不被檢查。

+4

我認爲這裏最重要的一點是,這個建議不是爲了效率,而是可讀性。 –

+0

但在這種情況下並不重要。 –

1

如果有任何與電子郵件作業ID匹配的作業,則.Any()方法可能會提前中止作業。同樣,.All()方法只要發現一個假的條件就會停止工作,這種情況會發生在同一個工作上。效率應該差不多。