C#列表过滤非可空字符串为何仍返回可空列表?
为什么过滤可空字符串列表后仍得到可空类型列表?
这是因为C#的nullable引用类型系统是静态分析机制,编译器无法自动识别你的过滤条件!string.IsNullOrWhiteSpace(p)已经完全排除了null和空字符串的情况,所以它会保留原集合的元素类型string?——毕竟从语法上看,Where只是筛选元素,不会改变元素的声明类型。
要得到非空字符串列表List<string>,可以用以下几种方法:
使用空值抑制运算符
!:显式告诉编译器,过滤后的元素肯定不为nullvar 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
相关产品推荐
相关产品推荐

