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

如何对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 08:37:34