C#使用Where方法判断List<string>含指定字符串不生效问题
问题原因
- 核心错误出在
First()方法的使用不符合预期:First()的返回值是匹配到的字符串元素,不是布尔值,当存在匹配项时,返回的非空字符串会被if判断隐式转换为true,所以这时候碰巧能返回正确结果。- 当不存在匹配项时,
Where()方法会返回空序列,First()遇到空序列会直接抛出InvalidOperationException异常,根本不会走到else分支返回false,这就是你说的逻辑不生效的原因。
最优修复方案
直接使用LINQ内置的Any()方法即可,这个方法就是专门用来判断序列中是否存在符合条件的元素,找到第一个匹配项就立即返回true,没有匹配项就返回false,完全符合你的需求,代码可以简化为:
public bool VerifyId(List<string> sheetData) { return sheetData.Any(q => q == "-1007401"); }
替代写法(不推荐)
如果你一定要保留Where的写法,需要把First()替换为FirstOrDefault(),判断返回值是否不为空即可:
public bool VerifyId(List<string> sheetData) { return sheetData.Where(q => q == "-1007401").FirstOrDefault() != null; }
这种写法性能和Any()一致,但可读性更差,没有必要使用。
内容的提问来源于stack exchange,提问作者user16687043
相关产品推荐
相关产品推荐

