繁体   English   中英

如何按清单分组 <int> 在字典中 <string, List<int> &gt;列表相同的地方?

[英]How do I group by List<int> in a Dictionary<string, List<int>> where the lists are identical?

我想使用Dictionary<string, List<int>> ,然后为字典中所有重复的List创建组。

Dictionary<string, List<int>> AllLists = new Dictionary<string, List<int>>()
{
    {"one", new List<int>() {1, 2, 3, 4, 5}},
    {"two", new List<int>() {1, 2, 3, 4, 5}},
    {"three", new List<int>() {1, 1, 1, 1, 1}}
};

var ListGroups = AllLists.GroupBy(p => p.Value);

这应该将具有匹配列表的字典索引分为自己的组,但是它只是为字典中的每个索引创建一个组。 我究竟做错了什么?

这将对List<int>对象使用引用比较。 由于包含[1, 2, 3, 4, 5]两个List<int>都是分别实例化的,因此它们将具有不同的引用。

请尝试以下操作,例如:

var ListGroups = AllLists.GroupBy(p => string.Join(",", p.Value));

这将按列表的string表示形式进行分组。 请注意,这可能不是您想要执行的操作,纯粹是示范性的。

您可以使用GroupBy方法的重载来传递自定义IEqualityComparer<List<int>> ,该自定义IEqualityComparer<List<int>>实际上使用Enumerable.SequenceEqual查看列表的内容。

这是IEqualityComparer<IEnumerable<T>>

class IEnumerableEqualityComparer<T> : IEqualityComparer<IEnumerable<T>>
{
    public bool Equals(IEnumerable<T> a, IEnumerable<T> b)
    {
        return Enumerable.SequenceEqual(a, b);
    }

    public int GetHashCode(IEnumerable<T> source)
    {
        if (source == null)
        {
            return 0;
        }
        int shift = 0;
        int result = 1;
        foreach (var item in source)
        {
            int hash = item != null ? item.GetHashCode() : 17;
            result ^= (hash << shift)
                    | (hash >> (32 - shift))
                    & (1 << shift - 1);
            shift = (shift + 1) % 32;
        }
        return result;
    }
}

使用方法如下:

var ListGroups = AllLists.GroupBy(p => p.Value,
    new IEnumerableEqualityComparer<int>());

请注意,由于IEqualityComparer<T>T是互变的,因此可以将以上代码用于List<int>因为它实现了IEnumerable<int>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM