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

如何让IEnumerable<T>的比较逻辑像SequenceEqual一样生效?

调整后的通用比较方法

可以通过先判断类型是否为IEnumerable<T>,再分别处理序列比较和普通类型比较来解决问题,同时兼顾null值的情况避免空引用异常。以下是修正后的实现:

bool foo<T>(T expected, T actual)
{
    // 处理两个引用相同(含均为null)的情况
    if (ReferenceEquals(expected, actual))
        return true;
    
    // 其中一方为null,直接返回false
    if (expected == null || actual == null)
        return false;
    
    // 识别数组、List<T>等所有泛型序列类型,执行序列相等比较
    if (expected is IEnumerable<T> expectedSeq && actual is IEnumerable<T> actualSeq)
    {
        return expectedSeq.SequenceEqual(actualSeq);
    }
    
    // 非序列类型,沿用默认相等比较逻辑
    return EqualityComparer<T>.Default.Equals(expected, actual);
}

关键说明

  1. null值防护:先用ReferenceEquals快速判断引用一致性,再单独处理单null场景,避免后续类型转换时抛出异常。
  2. 序列类型兼容:直接匹配IEnumerable<T>泛型接口,数组、List<T>等所有实现该接口的集合类型都会被正确识别,解决了你提到的数组和列表不生效的问题。
  3. 原有逻辑兼容:非序列类型依然使用原默认比较器,保证对基本类型、自定义值类型等的兼容性。

测试示例

// 数组比较
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
Console.WriteLine(foo(arr1, arr2)); // 输出True

// List比较
List<string> list1 = new List<string> {"a", "b"};
List<string> list2 = new List<string> {"a", "b"};
Console.WriteLine(foo(list1, list2)); // 输出True

// 基本类型比较
Console.WriteLine(foo(5, 5)); // 输出True
Console.WriteLine(foo("test", "test")); // 输出True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:48:30