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

C#列表过滤非可空字符串为何仍返回可空列表?

为什么过滤可空字符串列表后仍得到可空类型列表?

这是因为C#的nullable引用类型系统是静态分析机制,编译器无法自动识别你的过滤条件!string.IsNullOrWhiteSpace(p)已经完全排除了null和空字符串的情况,所以它会保留原集合的元素类型string?——毕竟从语法上看,Where只是筛选元素,不会改变元素的声明类型。

要得到非空字符串列表List<string>,可以用以下几种方法:

  • 使用空值抑制运算符!:显式告诉编译器,过滤后的元素肯定不为null

    var list = new List<string?> {"Cars", "Audi", "", "1920"};
    var list2 = list.Where(p => !string.IsNullOrWhiteSpace(p)).Select(p => p!).ToList();
    
  • 使用OfType<string>筛选类型:null不属于string类型,OfType<string>会自动过滤掉null并返回IEnumerable<string>

    var list2 = list.Where(p => !string.IsNullOrWhiteSpace(p)).OfType<string>().ToList();
    
  • 结合模式匹配显式声明类型:通过模式匹配确保元素非空,再指定ToList<string>明确目标类型

    var list2 = list.Where(p => p is not null && !string.IsNullOrWhiteSpace(p)).ToList<string>();
    // 更简洁的模式写法
    var list2 = list.Where(p => p is { Length: > 0 }).ToList<string>();
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:20:55