是否可以使用linq GroupBy一组值?

时间:2012-08-02 15:19:02

标签: c# linq group-by hashset

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

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

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

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

最干净的方法是什么?

3 个答案:

答案 0 :(得分:8)

您可以使用静态HashSet<T>.CreateSetComparer方法来实现此目的。

  

返回值

     

类型:System.Collections.Generic.IEqualityComparer&gt;一个   IEqualityComparer对象,可用于深度相等测试   HashSet对象。

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

答案 1 :(得分:3)

(我假设您要将两个集合分组为&#34;等于&#34; - 问题不是非常清楚)

正如LINQ的情况一样,实现此目的的脚手架已经存在,需要做的是为适当的方法提供自定义IEqualityComparer<T>。在这种情况下,这意味着使用this overload

这里是一个通用的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();

答案 2 :(得分:0)

var result=new HashSet<int> { 4 }.Union(new HashSet<int> { 4 }).Count();