如何让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); }
关键说明
- null值防护:先用
ReferenceEquals快速判断引用一致性,再单独处理单null场景,避免后续类型转换时抛出异常。 - 序列类型兼容:直接匹配
IEnumerable<T>泛型接口,数组、List<T>等所有实现该接口的集合类型都会被正确识别,解决了你提到的数组和列表不生效的问题。 - 原有逻辑兼容:非序列类型依然使用原默认比较器,保证对基本类型、自定义值类型等的兼容性。
测试示例
// 数组比较 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
相关产品推荐
相关产品推荐

