是否可以使用linq对一组值进行GroupBy

本文关键字:一组 GroupBy 可以使 linq 是否 | 更新日期: 2024-09-20 05:14:50

我知道如何使用匿名类型按固定的值列表进行分组。我想做的是按照一组实际的值进行分组。

例如,此表达式的结果为2。

new List<HashSet<int>> {
    new HashSet<int> { 4 },
    new HashSet<int> { 4 }
}.GroupBy (x => x).Count()

我正在寻找一种方法,把这些集合放在同一组中,这样结果就会是1。在python中,这将使用frozenset来完成。

做这件事最干净的方法是什么?

是否可以使用linq对一组值进行GroupBy

您可以为此使用静态HashSet<T>.CreateSetComparer方法。

返回值

类型:系统。集合。通用的IEqualityComparer>An可用于的深度相等测试的IEqualityComparer对象HashSet对象。

new List<HashSet<int>> {
    new HashSet<int> { 4 },
    new HashSet<int> { 4 }
}.GroupBy (x => x, HashSet<int>.CreateSetComparer())

与LINQ的常见情况一样,实现这一点的脚手架已经存在,需要做的是向适当的方法提供自定义的IEqualityComparer<T>。在这种情况下,这意味着使用这种过载。

这里有一个通用的IEqualityComparer<ISet<T>>,它声明两个集合相等,如果它们的交集与它们都是同一个集合:

class SetComparer<T> : IEqualityComparer<ISet<T>> {
    public bool Equals(ISet<T> lhs, ISet<T> rhs) {
        // null checks omitted
        return lhs.SetEquals(rhs);
    }
    public int GetHashCode(ISet<T> set) {
        // Not the best choice for a hash function in general,
        // but in this case it's just fine.
        return set.Count;
    }
}

以下是如何将两个集合放在同一个保护伞下:

new List<HashSet<int>> {
    new HashSet<int> { 4 },
    new HashSet<int> { 4 }
}.GroupBy (x => x, new SetComparer<int>()).Count();
var result=new HashSet<int> { 4 }.Union(new HashSet<int> { 4 }).Count();