C#中如何判断结构体不为null?无需转为类
结构体List查找结果的非空判断方案
你遇到的错误本质是:结构体是值类型,永远不可能为null。List<T>.Find方法在找不到匹配项时,会返回该结构体的默认值(即default(MyMap)),而非null,所以直接用!= null会触发编译错误。
下面是几种无需将结构体转为类的解决方法:
方法1:先检查存在性再获取(适合小List)
先用Exists方法确认是否有匹配项,再调用Find获取对象:
if (myMaps.Exists(o => o.idx.ToString() == "1")) { MyMap e_res_i = myMaps.Find(o => o.idx.ToString() == "1"); // 执行你的业务逻辑 }
缺点是会遍历List两次,数据量大时效率较低。
方法2:用可空值类型包裹(推荐)
将结构体转为可空值类型(MyMap?,C# 8.0+支持),结合FirstOrDefault方法获取结果,再通过HasValue判断是否找到有效对象:
MyMap? e_res_i = myMaps.FirstOrDefault(o => o.idx.ToString() == "1"); if (e_res_i.HasValue) { MyMap actualMap = e_res_i.Value; // 执行你的业务逻辑 }
这种方法只遍历一次List,且能准确判断是否找到匹配项,是最优方案。
方法3:比较默认值(需谨慎使用)
如果你的结构体默认值(比如idx为0、空字符串等)不会出现在实际业务数据中,可以直接比较返回值是否等于默认值:
MyMap e_res_i = myMaps.Find(o => o.idx.ToString() == "1"); if (!e_res_i.Equals(default(MyMap))) { // 执行你的业务逻辑 }
注意:如果业务中存在与默认值完全一致的结构体对象,会导致误判,所以仅在能确保默认值无业务意义时使用。
内容的提问来源于stack exchange,提问作者Mich
相关产品推荐
相关产品推荐

