You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 00:50:28