C#数组元素检查函数异常:匹配元素仍返回false
数组元素检查返回false的问题分析与解决
你的代码核心问题在于**object类型用==比较的是引用相等**,而非值相等:
当你把int这类值类型放入object[]数组时,每个元素都会被自动装箱成独立的object实例。此时用tempVar == x比较的是两个装箱对象的引用地址,而非它们实际存储的数值,所以即使值相同,也会返回false。
修复方案1:改用Equals方法比较值
Equals方法对于值类型已经被重写,会直接比较实际数值,修改后的代码如下:
public class whatever { public bool checkArray(object[] a, object x) { int index = 0; while (index < a.Length) { object item = a[index]; // 用Equals比较值相等,同时处理null情况 if (item != null && item.Equals(x)) { return true; // 找到元素后直接返回,无需遍历剩余元素 } index++; } return false; } }
注:增加item != null判断,避免数组元素为null时调用Equals抛出空引用异常。
修复方案2:使用泛型方法(更推荐)
泛型可以避免值类型装箱的问题,同时保证类型安全,性能也更好:
public class whatever { public bool checkArray<T>(T[] a, T x) { foreach (var item in a) { // EqualityComparer<T>.Default会自动处理值类型/引用类型的比较,同时兼容null if (EqualityComparer<T>.Default.Equals(item, x)) { return true; } } return false; } }
调用时直接传入int数组即可,无需装箱:
whatever checking = new whatever(); int[] s = { 1,2,3,54,62}; Console.Write(checking.checkArray(s,3));
内容的提问来源于stack exchange,提问作者Magan
相关产品推荐
相关产品推荐

