为什么Resharper建议我将“不等于”简化为“所有不相等”?

时间:2013-12-20 13:47:43

标签: c# linq resharper

我需要检查C#中的项目列表中是否存在某个项目,所以我有这一行:

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

Resharper建议我将其更改为:

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

我可以看出它们是等价的,但为什么它表明这种变化呢?由于某种原因,第一个实现是否较慢?

3 个答案:

答案 0 :(得分:26)

表达的可读性对我个人意见。

我会读这个

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

as'是我的项目不在集合中'。这个地方

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

读作“集合中的所有项目都与我的项目不同”。

如果'问题'我想问 - 通过我的linq查询 - '我的项目不在列表中',那么第一个查询更适合我想问的问题。第一个查询前面的!不是问题。

答案 1 :(得分:17)

在第一个示例中,很容易错过表达式开头的!。因此,您的表达难以理解。另外,第一个例子读作“not any equal”,而第二个例子是“all not equal to”。将易于阅读的代码表达为更易于阅读的英语并非巧合。

更容易阅读代码可能会减少错误,因为在更改代码之前更容易理解代码。这是因为第二个例子更清楚ReSharper建议更改你的代码。

答案 2 :(得分:3)

一般来说,问一个积极的问题更直观。如果你问用户“你真的不想删除这条记录吗?”,猜猜他按错键的次数。

我个人喜欢这样的结构:

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

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

异常可能是not null的测试,其中a != null可能被视为正面。