LINQ .Any()方法返回错误值问题求助
问题原因与解决方案
哦,我一眼就看到问题所在啦!你这段代码的逻辑踩了个很容易犯的小坑:
你写的myList.Select(x => x.Id == 'MyId').Any(),其实做了两件事:
Select会把列表里的每一个元素,转换成一个布尔值(判断这个元素的Id是不是等于'MyId'的结果),生成一个布尔值序列- 后面的
Any()默认是检查这个序列是否包含至少一个元素,而不是检查序列里有没有true的元素
所以只要myList不为空,不管有没有匹配的Id,这个布尔序列至少有一个元素,Any()就会返回true,这就是为什么你觉得结果不对。
正确的写法有两种,推荐第一种:
- 最简洁高效的写法:直接使用
Any的带条件重载,它会直接遍历列表,找到第一个符合条件的元素就停止,性能更好:var myList = GetMethod(); if(myList != null && myList.Any(x => x.Id == "MyId")) { // Do work } - 如果一定要保留
Select的写法(其实没必要),可以给Any加一个判断条件,检查序列里是否有true的元素:var myList = GetMethod(); if(myList != null && myList.Select(x => x.Id == "MyId").Any(b => b)) { // Do work }
额外优化:简化空判断
你还可以用C#的空条件运算符和空合并运算符,让代码更简洁:
var myList = GetMethod(); if(myList?.Any(x => x.Id == "MyId") ?? false) { // Do work }
myList?.Any(...)会在myList为null时返回null,然后?? false把null转换成false,逻辑和之前完全一致,但代码更紧凑。
内容的提问来源于stack exchange,提问作者S M
相关产品推荐
相关产品推荐

