我需要檢查是否一個項目不會在C#項目列表存在,所以我有這樣一行:爲什麼Resharper建議我簡化「不等於」「不等於」?
if (!myList.Any(c => c.id == myID)))
ReSharper的是在暗示我應該改變,要:
if (myList.All(c => c.id != myID)))
我可以看出它們是相同的,但它爲什麼會提示更改?由於某種原因,第一種執行速度較慢?
我需要檢查是否一個項目不會在C#項目列表存在,所以我有這樣一行:爲什麼Resharper建議我簡化「不等於」「不等於」?
if (!myList.Any(c => c.id == myID)))
ReSharper的是在暗示我應該改變,要:
if (myList.All(c => c.id != myID)))
我可以看出它們是相同的,但它爲什麼會提示更改?由於某種原因,第一種執行速度較慢?
在第一個例子中,在表達式的開頭部分很容易錯過!
。你因此使表達難以閱讀。另外,第一個例子是「不等於」,而第二個例子是「不等於」。並不是巧合,易於閱讀的代碼可以表達爲更容易閱讀英文。
更容易閱讀的代碼很可能會少一些錯誤,因爲它更容易理解它在改變它之前的作用。這是因爲第二個例子更清楚ReSharper建議更改您的代碼。
我個人發現第一個更容易閱讀,雖然我絕對採取你的觀點,俯瞰!也許第一個也是最容易誤解的。 –
如果您認爲它更具可讀性,請添加另一個名爲'None'的擴展方法? –
多數民衆贊成在@RogerLipscombe –
表達的可讀性對我個人的意見。
爲「我不是在集合項目」我會讀這個
if (!myList.Any(c => c.id == myID)))
。這裏
if (myList.All(c => c.id != myID)))
讀爲「集合中的所有項目都不同於我的項目」。
如果我想問的'問題' - 通過我的linq查詢 - '是我的項目不在列表中',那麼第一個查詢更適合我想問的問題。第一個查詢前面的!
不是問題。
這是非常有趣的,因爲我也發現我想要做的英語的第一場比賽,但其他人不同意 –
@CodingKiwi我們只有通用的一行代碼。在這個比賽中,我還會選擇All方法。但是你有比我們更多的背景。在這個複雜的背景下任何人都可能會感覺更好不僅感覺更好,而且還可以更易讀。 – Ralf
這是如此的真實。如果我的頭腦中有內部敘述的代碼流,我更喜歡它。例如,任何(==)在我思考時都很有意義,「這是當我需要處理找不到我想要的情況時」。當你發現自己在思考時,所有(!=)更合適,「這是我們需要驗證我在這裏所有的東西都是有效的」。這完全是關於將代碼與內部敘述進行匹配,所以你不必這麼想。 – bowserm
一般來說,提出一個積極的問題是更直觀的。如果你問用戶「你真的不想刪除這個記錄?」,猜猜他多久會碰到一個錯誤的按鈕。
我個人喜歡把構建這樣的周圍:
// Not optimal
if (!x) {
A();
} else }
B();
}
// Better
if (x) {
B();
} else }
A();
}
例外可能是測試not null
其中a != null
可能被看作是積極的。
這裏提出的問題是'我的物品沒有出現在列表中',我仍然將其視爲一個正常問題,您可以將其視爲正面情況。 '是的,這是缺席,然後這樣做......' – Maarten
「我的物品不是在列表中」更接近OS的原始代碼。像myList.Absent(c => c.id == myID)這樣的假設性陳述會更直接。我同意在這裏'全部'情況也不是很直觀。在我看來'resharper'往往是清教徒和過分熱心的。 –
不,它會運行到相同的查詢,但對我來說更清楚:「所有不等於」與「不等於」 – wudzik
第二行更清晰。 – Max
可讀性,哪一個可讀? –