2013-12-20 78 views
24

我需要檢查是否一個項目不會在C#項目列表存在,所以我有這樣一行:爲什麼Resharper建議我簡化「不等於」「不等於」?

if (!myList.Any(c => c.id == myID))) 

ReSharper的是在暗示我應該改變,要:

if (myList.All(c => c.id != myID))) 

我可以看出它們是相同的,但它爲什麼會提示更改?由於某種原因,第一種執行速度較慢?

+1

不,它會運行到相同的查詢,但對我來說更清楚:「所有不等於」與「不等於」 – wudzik

+2

第二行更清晰。 – Max

+0

可讀性,哪一個可讀? –

回答

15

在第一個例子中,在表達式的開頭部分很容易錯過!。你因此使表達難以閱讀。另外,第一個例子是「不等於」,而第二個例子是「不等於」。並不是巧合,易於閱讀的代碼可以表達爲更容易閱讀英文。

更容易閱讀的代碼很可能會少一些錯誤,因爲它更容易理解它在改變它之前的作用。這是因爲第二個例子更清楚ReSharper建議更改您的代碼。

+9

我個人發現第一個更容易閱讀,雖然我絕對採取你的觀點,俯瞰!也許第一個也是最容易誤解的。 –

+5

如果您認爲它更具可讀性,請添加另一個名爲'None'的擴展方法? –

+0

多數民衆贊成在@RogerLipscombe –

20

表達的可讀性對我個人的意見。

爲「我不是在集合項目」我會讀這個

if (!myList.Any(c => c.id == myID))) 

。這裏

if (myList.All(c => c.id != myID))) 

讀爲「集合中的所有項目都不同於我的項目」。

如果我想問的'問題' - 通過我的linq查詢 - '是我的項目不在列表中',那麼第一個查詢更適合我想問的問題。第一個查詢前面的!不是問題。

+5

這是非常有趣的,因爲我也發現我想要做的英語的第一場比賽,但其他人不同意 –

+0

@CodingKiwi我們只有通用的一行代碼。在這個比賽中,我還會選擇All方法。但是你有比我們更多的背景。在這個複雜的背景下任何人都可能會感覺更好不僅感覺更好,而且還可以更易讀。 – Ralf

+0

這是如此的真實。如果我的頭腦中有內部敘述的代碼流,我更喜歡它。例如,任何(==)在我思考時都很有意義,「這是當我需要處理找不到我想要的情況時」。當你發現自己在思考時,所有(!=)更合適,「這是我們需要驗證我在這裏所有的東西都是有效的」。這完全是關於將代碼與內部敘述進行匹配,所以你不必這麼想。 – bowserm

3

一般來說,提出一個積極的問題是更直觀的。如果你問用戶「你真的不想刪除這個記錄?」,猜猜他多久會碰到一個錯誤的按鈕。

我個人喜歡把構建這樣的周圍:

// Not optimal 
if (!x) { 
    A(); 
} else } 
    B(); 
} 

// Better 
if (x) { 
    B(); 
} else } 
    A(); 
} 

例外可能是測試not null其中a != null可能被看作是積極的。

+0

這裏提出的問題是'我的物品沒有出現在列表中',我仍然將其視爲一個正常問題,您可以將其視爲正面情況。 '是的,這是缺席,然後這樣做......' – Maarten

+2

「我的物品不是在列表中」更接近OS的原始代碼。像myList.Absent(c => c.id == myID)這樣的假設性陳述會更直接。我同意在這裏'全部'情況也不是很直觀。在我看來'resharper'往往是清教徒和過分熱心的。 –

相關問題