2013-12-20 79 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'往往是清教徒和过分热心的。 –

相关问题