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

如何用Linq获取List<List<int>>中的唯一子列表?

解决List<List>的Linq去重问题

直接用Distinct()或GroupBy(x => x)无法去重,是因为默认的比较逻辑是比较对象引用,而非子列表的内容。两个元素完全相同的List<int>是不同的实例,所以会被判定为不同项。

以下是几种可行的Linq实现方式:

方法一:自定义相等比较器

创建一个实现IEqualityComparer<List<int>>的比较器,让Linq按子列表内容比较:

public class ListIntEqualityComparer : IEqualityComparer<List<int>>
{
    public bool Equals(List<int> x, List<int> y)
    {
        if (x is null || y is null)
            return x == y;
        // 按元素序列比较是否相等
        return x.SequenceEqual(y);
    }

    public int GetHashCode(List<int> obj)
    {
        if (obj is null) return 0;
        // 基于子列表元素生成哈希值
        int hash = 17;
        foreach (int num in obj)
        {
            hash = hash * 31 + num.GetHashCode();
        }
        return hash;
    }
}

使用时将比较器传入Distinct()或GroupBy:

var originalList = new List<List<int>> { new List<int>{1,2,3}, new List<int>{1,2,3} };

// 用Distinct去重
var uniqueLists = originalList.Distinct(new ListIntEqualityComparer()).ToList();

// 或用GroupBy+Select去重
var uniqueLists = originalList.GroupBy(x => x, new ListIntEqualityComparer())
                              .Select(g => g.First())
                              .ToList();

方法二:将子列表转换为可默认比较的类型

如果不想写自定义比较器,可以把每个子列表转换成字符串、元组等能被默认逻辑比较的类型,再基于转换后的值分组:

转换为字符串(适合任意长度子列表)

var uniqueLists = originalList.GroupBy(x => string.Join(",", x))
                              .Select(g => g.First())
                              .ToList();

注意:如果子列表元素包含分隔符(比如逗号),会导致错误的分组结果,需要换用不会冲突的分隔符。

转换为元组(适合固定长度子列表)

如果所有子列表长度固定(比如都是3个元素),可以用值元组:

var uniqueLists = originalList.GroupBy(x => (x[0], x[1], x[2]))
                              .Select(g => g.First())
                              .ToList();

内容的提问来源于stack exchange,提问作者Char

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:04:55