C#使用Find()方法时如何将null与空列表判定为相等
解决思路
你需要对listB的null值做前置转换,统一转成空序列后再判断两个序列的内容是否相等,原来的==运算符对于集合类型默认是比较引用,自然不会认为null和空列表等价。
直接可用的实现代码
// 请将代码中的YourElementType替换为listB存储元素的实际类型,比如int、string等 MyObject obj = existingObjs.Find(x => x.listA == currentObj.listA && Enumerable.SequenceEqual( x.listB ?? Enumerable.Empty<YourElementType>(), currentObj.listB ?? Enumerable.Empty<YourElementType>() ));
??是空合并运算符,当左侧值为null时会返回右侧的空序列,这样就能把null和空列表统一成相同的比较基准,再用SequenceEqual判断两个序列的元素是否完全一致。
原错误代码原因说明
你写的三元表达式最终返回的是集合对象,而&&运算符要求两侧都是布尔类型的判断结果,因此编译不通过。
可选优化方案
如果频繁需要这类比较,可以封装扩展方法简化调用:
public static class CollectionCompareExtension { public static bool EqualsNullAsEmpty<T>(this IEnumerable<T> source, IEnumerable<T> target) { return Enumerable.SequenceEqual( source ?? Enumerable.Empty<T>(), target ?? Enumerable.Empty<T>() ); } }
封装后调用代码可以简化为:
MyObject obj = existingObjs.Find(x => x.listA == currentObj.listA && x.listB.EqualsNullAsEmpty(currentObj.listB) );
注意事项
如果listB存储的是自定义引用类型,需要确保该类型已经重写了Equals和GetHashCode方法,否则SequenceEqual会默认按引用比较元素,可能出现内容相同但判定为不相等的情况。
内容的提问来源于stack exchange,提问作者Jeremy P
相关产品推荐
相关产品推荐

