我需要检查C#中的项目列表中是否存在某个项目,所以我有这一行:
if (!myList.Any(c => c.id == myID)))
Resharper建议我将其更改为:
if (myList.All(c => c.id != myID)))
我可以看出它们是等价的,但为什么它表明这种变化呢?由于某种原因,第一个实现是否较慢?
答案 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
可能被视为正面。