如何用LINQ或其他方法判断ParentClass内部列表是否非空
问题
如何使用LINQ或其他方法判断内部列表类是否存在元素数量大于0的情况?
现有ParentClass类,该类包含10个内部列表属性,分别为ChildClass1至ChildClass10,类型对应为List<ChildClass1>到List<ChildClass10>,类定义如下:
public class ParentClass { public List<ChildClass1> ChildClass1 { get; set; } public List<ChildClass2> ChildClass2 { get; set; } // ... public List<ChildClass10> ChildClass10 { get; set; } }
当前持有ParentClass的实例ParentClassObj,需要判断是否存在任意一个内部列表的元素数量大于0。现有的解决方案是逐个判断每个列表的Any()方法,但这种方式需要检查全部10个列表,可行性较低,代码示例如下:
if(!(ParentClassObj.ChildClass1.Any() && ParentClassObj.ChildClass2.Any() ...) { // return not found }
请问是否存在使用LINQ或其他方法的优化解决方案?
优化解决方案
方法一:反射+LINQ(无硬编码,扩展性强)
通过反射自动获取所有列表类型属性,再用LINQ判断是否存在非空列表,无需硬编码每个属性名:
using System.Reflection; bool hasNonEmptyList = typeof(ParentClass) .GetProperties(BindingFlags.Public | BindingFlags.Instance) // 筛选所有List<T>类型的属性 .Where(prop => prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(List<>)) // 获取属性值并转为IEnumerable .Select(prop => prop.GetValue(ParentClassObj) as System.Collections.IEnumerable) // 排除未初始化的null列表 .Where(list => list != null) // 判断是否存在有元素的列表 .Any(list => list.GetEnumerator().MoveNext()); if (!hasNonEmptyList) { // return not found }
方法二:手动枚举列表(性能更优)
如果不想用反射,可将所有列表属性统一收集到集合中,再用LINQ简化判断,代码比逐个写更整洁:
// 统一收集所有列表属性 var childLists = new[] { ParentClassObj.ChildClass1, ParentClassObj.ChildClass2, // ... ParentClassObj.ChildClass10 }; // 判断是否存在非空列表 bool hasNonEmptyList = childLists.Any(list => list?.Any() == true); if (!hasNonEmptyList) { // return not found }
方法三:修改ParentClass类(最佳实践)
如果有权限修改原类,可新增专门的判断方法,后续维护更便捷:
public class ParentClass { public List<ChildClass1> ChildClass1 { get; set; } public List<ChildClass2> ChildClass2 { get; set; } // ... public List<ChildClass10> ChildClass10 { get; set; } public bool HasAnyNonEmptyChildList() { return (ChildClass1?.Any() ?? false) || (ChildClass2?.Any() ?? false) || // ... (ChildClass10?.Any() ?? false); } }
使用时直接调用:
if (!ParentClassObj.HasAnyNonEmptyChildList()) { // return not found }
内容的提问来源于stack exchange,提问作者Earth
相关产品推荐
相关产品推荐

