如何对ulong类型数组列表实现去重?是否需自定义比较器?
问题原因&解决方案
没错,你遇到的问题是因为数组是引用类型,默认的Distinct()方法是比较对象的引用地址,而不是数组内部的元素内容。即使两个数组的元素完全一致,只要它们是不同的数组实例,就会被Distinct()判定为不同的元素,所以去重没有效果。
你需要提供一个自定义的相等比较器来告诉Distinct()如何判断两个ulong[]是否相等,或者通过转换为值类型的方式间接实现去重。下面是几种可行的方案:
方案一:自定义IEqualityComparer<ulong[]>
这是最通用的方法,适合任意长度的ulong数组:
首先创建一个实现IEqualityComparer<ulong[]>的比较器类:
public class UlongArrayEqualityComparer : IEqualityComparer<ulong[]> { // 判断两个数组是否元素完全一致 public bool Equals(ulong[] x, ulong[] y) { // 处理null情况 if (x == null && y == null) return true; if (x == null || y == null) return false; // 长度不同直接不相等 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(ulong[] obj) { if (obj == null) return 0; int hash = 17; foreach (ulong num in obj) { hash = hash * 31 + num.GetHashCode(); } return hash; } }
然后在调用Distinct()时传入这个比较器:
TestList = TestList.Distinct(new UlongArrayEqualityComparer()).ToList();
方案二:利用LINQ分组(固定长度数组专属)
因为你的数组长度固定为6,可以将数组转换为值元组(ValueTuple)——值类型会自动按内容比较,然后通过分组去重:
TestList = TestList .GroupBy(arr => (arr[0], arr[1], arr[2], arr[3], arr[4], arr[5])) .Select(group => group.First()) // 取每组的第一个元素 .ToList();
这种方式不需要额外写比较器,性能也很好,缺点是只适用于长度固定的数组。
方案三:字符串拼接(简单但性能略低)
把数组元素拼接成唯一的字符串,以此作为分组依据:
TestList = TestList .GroupBy(arr => string.Join(",", arr)) .Select(group => group.First()) .ToList();
这种写法最简洁,但如果数组元素数量多,字符串拼接会带来一定的性能开销,不过对于你的场景(数组长度6)来说完全够用。
内容的提问来源于stack exchange,提问作者Teddy
相关产品推荐
相关产品推荐

