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

C#使用LINQ如何根据条件过滤返回指定对象列表

按条件过滤嵌套分类条目的实现方案

你需要过滤的是每个外层对象下嵌套的ObjectDetails集合中category值为3的条目,而非外层对象本身,原有分支写法的问题是没有针对内层嵌套集合做过滤,因此无法生效。

最优实现(无额外分支,性能最优)

直接在构建ObjectDetails集合的逻辑末尾追加过滤条件,不需要额外写if-else分支,一次遍历即可完成构建和过滤:

var objectQuery = query
    .ToList()
    .Select(a => new
    {
        a.Id,
        ObjectDetails = (new ObjectClass[] { })
            .Concat(/* 原有Concat逻辑保持不变 */)
            .Concat(/* 原有Concat逻辑保持不变 */)
            .Distinct()
            .Select(f => new
            {
                f.ObjectDetails.Id,
                f.ObjectDetails.Name,
                f.ObjectDetails.DisplayName,
                category = (int)f.ObjectDetails.Category,
                f.ObjectDetails.IsArchived,
            })
            // 追加过滤逻辑:条件a不成立时全保留,成立时排除category=3的项
            .Where(detail => !conditionA || detail.category != 3)
    });

// 多余的ToList()可以去掉,FirstOrDefault直接取首项即可
return objectQuery.FirstOrDefault();

过滤条件的逻辑说明:

  • 当conditionA为false时,!conditionA直接判定为真,Where条件恒成立,所有条目全部保留
  • 当conditionA为true时,执行后半段判断,仅保留category != 3的条目

兼容原有逻辑的分支写法

如果你不想修改原有查询构建的代码,可以在最终返回前对结果做二次处理,修正后的分支逻辑如下:

var result = objectQuery.FirstOrDefault();
// 结果为空直接返回
if (result == null) return null;

if (conditionA)
{
    // 条件成立时重新投影对象,过滤内层分类为3的条目
    return new
    {
        result.Id,
        ObjectDetails = result.ObjectDetails.Where(d => d.category != 3).ToList()
    };
}

// 条件不成立直接返回原始结果
return result;

注意事项

  • 你定义匿名类时分类字段名是小写的category,写过滤条件时要和字段名保持一致,不要写成大写开头的Category,否则会触发属性不存在的编译错误
  • 不需要在FirstOrDefault()前额外调用ToList(),会产生不必要的内存分配,影响性能

内容的提问来源于stack exchange,提问作者Quentin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:54:40