如何在List<int[]>中查找int[2]类型元素的索引?
问题原因及解决建议
为什么IndexOf返回-1?
数组是引用类型,List<T>.IndexOf(T)默认使用引用相等性判断——它比较的是两个数组对象的内存地址,而非数组内的元素值。你创建的new int[] {3,4}是全新的数组对象,和列表中已存在的{3,4}数组不是同一个实例,所以找不到匹配项,返回-1。
解决方法
方法1:使用FindIndex自定义元素匹配逻辑
直接用FindIndex方法,传入lambda表达式手动判断数组元素是否符合条件:
var index = coordinates.FindIndex(arr => arr.Length == 2 && arr[0] == 3 && arr[1] == 4); Console.WriteLine(index); // 输出1,符合预期
这种方式简单直接,适合单次或简单的查找场景。
方法2:自定义相等比较器(适合多次复用)
如果需要频繁进行数组元素的相等判断,可以实现IEqualityComparer<int[]>接口封装比较逻辑:
public class IntArrayEqualityComparer : IEqualityComparer<int[]> { public bool Equals(int[] x, int[] y) { if (x == null || y == null) return x == y; if (x.Length != y.Length) return false; for (int i = 0; i < x.Length; i++) { if (x[i] != y[i]) return false; } return true; } public int GetHashCode(int[] obj) { if (obj == null) return 0; int hash = 17; foreach (int num in obj) { hash = hash * 31 + num.GetHashCode(); } return hash; } }
然后使用IndexOf的重载版本传入自定义比较器:
var index = coordinates.IndexOf(new int[] {3,4}, new IntArrayEqualityComparer()); Console.WriteLine(index); // 输出1,符合预期
这种方式将比较逻辑封装,适合多次重复使用的场景,代码更整洁。
内容的提问来源于stack exchange,提问作者J B
相关产品推荐
相关产品推荐

