如何在foreach循环中对JArray.Children()进行空值检查?
解决方法
方案一:直接用null合并运算符修正类型
你之前的写法无法编译是因为Enumerable.Empty<T>()里的T未和Children()的返回类型匹配,且需确保引入System.Linq命名空间。修改后代码如下:
using System.Linq; // 必须引入该命名空间 JArray jArrayJson = (JArray)token.SelectToken("text"); foreach (JToken item in jArrayJson?.Children() ?? Enumerable.Empty<JToken>()) { // 你的业务逻辑 }
当jArrayJson为null时,jArrayJson?.Children()返回null,此时??会将其替换为Enumerable.Empty<JToken>(),foreach会遍历空集合,既不会执行循环体,也不会触发空值报错。
方案二:编写适配IEnumerable<T>的扩展方法
你之前的扩展方法仅针对IList<T>,但JArray.Children()返回的是IEnumerable<JToken>,因此需要修改扩展方法的参数类型:
using System.Collections.Generic; using System.Linq; public static class EnumerableExtensions { public static IEnumerable<T> OrEmptyIfNull<T>(this IEnumerable<T> source) { return source ?? Enumerable.Empty<T>(); } }
之后即可直接在代码中使用:
JArray jArrayJson = (JArray)token.SelectToken("text"); foreach (JToken item in jArrayJson?.Children().OrEmptyIfNull()) { // 你的业务逻辑 }
这个扩展方法适用于所有IEnumerable<T>类型,通用性更强,不止可用于JArray的Children集合。
内容的提问来源于stack exchange,提问作者Tech develop
相关产品推荐
相关产品推荐

