我知道如何使用匿名类型按固定的值列表进行分组。我想要做的是按实际的一组值进行分组。
例如,此表达式的结果为2。
new List<HashSet<int>> {
new HashSet<int> { 4 },
new HashSet<int> { 4 }
}.GroupBy (x => x).Count()
我正在寻找一种方法将这些集合放在同一个组中,结果将是1.在python中,这将使用frozenset
来完成。
最干净的方法是什么?
答案 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();