更具体一点:Any(IEnumerable collection, Func predicate)
一旦谓词对一个项目产生了真值,Linq扩展方法是否会停止检查集合中的所有剩余元素?
因为我不想花很多时间来弄清楚我是否需要做真正昂贵的零件:
if(lotsOfItems.Any(x => x.ID == target.ID))
//do expensive calculation here
Run Code Online (Sandbox Code Playgroud)
因此,如果Any
始终检查源中的所有项目,这可能最终浪费时间而不是仅仅是:
var candidate = lotsOfItems.FirstOrDefault(x => x.ID == target.ID)
if(candicate != null)
//do expensive calculation here
Run Code Online (Sandbox Code Playgroud)
因为我很确定它FirstOrDefault
一旦得到结果就会返回,只有Enumerable
在集合中没有找到合适的条目时才会继续通过整体.
有没有Any
人有关于这种决定的内部运作的信息,或者有人可以提出解决方案吗?
此外,一位同事提出了类似的建议:
if(!lotsOfItems.All(x => x.ID != target.ID))
Run Code Online (Sandbox Code Playgroud)
因为这应该是一旦条件第一次返回假就停止但是我不确定,所以如果有人能够对此有所了解,那将是值得赞赏的.
我在同事的一个项目中偶然发现了这一点:
foreach (var invalidChar in Path.GetInvalidFileNameChars())
fileName = fileName.Replace(invalidChar, '\0');
Run Code Online (Sandbox Code Playgroud)
gerenal的想法是显而易见的,但我想知道为什么他选择用null字符替换无效字符而不是'常规'字符或只是空字符串.
我猜这个选择有很好的理由(写这篇文章的人是我们团队的老人),我只想知道这个原因是什么.