如何使用LINQ对列表列表进行分组(例如:list<;list<;int>;>;)

本文关键字:lt list 列表 gt 例如 int LINQ 何使用 | 更新日期: 2023-09-27 18:00:10

我知道用一些for循环可以很容易地做到这一点,但我想看看是否有一种方法可以用流利的LINQ做到这一步。我正在试着找出每个子列表中我有多少。

我在看Enumerable.SequenceEqual,但无法使用GroupBy()

假设我有一个像这样的List<List<int>

{
 {1,2}
 {2, 3, 4}
 {1,2}
 {1,3}
 {1,2}
}

我想把它按相等的列表分组,就像一样

{
 <3, {1,2}>
 <1, {2, 3, 4>
 <1, {1,3}
}

如何使用LINQ对列表列表进行分组(例如:list<;list<;int>;>;)

您需要实现一个IEqualityComparer<List<T>>,然后可以将其传递到GroupBy中。例如:

public class ListEqualityComparer<T> : IEqualityComparer<List<T>>
{
    public bool Equals(List<T> lhs, List<T> rhs)
    {
        return lhs.SequenceEqual(rhs);
    }
    public int GetHashCode(List<T> list)
    {
        unchecked
        {
            int hash = 23;
            foreach (T item in list)
            {
                hash = (hash * 31) + (item == null ? 0 : item.GetHashCode());
            }
            return hash;
        }
    }
}

然后:

var counts = lists.GroupBy(x => x, 
                           (key, lists) => new { List = key, Count = lists.Count() },
                           new ListEqualityComparer<int>());