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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:09:04