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

mat*_*scb 2 c# linq

我知道我可以通过一些for循环轻松地做到这一点,但是想看看是否有办法用流畅的LINQ来做到这一点.我试图找出每个子列表中有多少个.

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

说我有List<List<int>这样的:

{
 {1,2}
 {2, 3, 4}
 {1,2}
 {1,3}
 {1,2}
}
Run Code Online (Sandbox Code Playgroud)

我希望用相同的列表对它进行分组,就像这样

{
 <3, {1,2}>
 <1, {2, 3, 4>
 <1, {1,3}
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

你需要实现一个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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

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

  • @mateuscb:不,目的是保持哈希码不同于{1,2}和{2,1} - 例如使订单重要. (2认同)