我正在解决一个问题,该问题利用了 HashSet 不允许重复值的事实。为此,Java 中的解决方案计算多个 HashSet<int>
并将它们添加到 HashSet<HashSet<int>>
最后返回尺寸。这样它就可以获得 HashSet 的所有不同组合。
当我尝试在 C# 中执行此操作时,我没有得到不同的 HashSet。我调试了一下,可以看到两个具有相同值的HashSet。正如下面的屏幕截图所示。
那么有没有一种方法可以在 C# 中获得相同的行为,可能通过使用我自己的比较器,或者如果没有它可能会更好。我尝试创建自己的比较方法,但 HashSet 没有索引,因此不确定如何比较两个 HashSet。或者说这在 C# 中是不可能的。 我注意到的一件事是在 Java 中初始化如下:
Set shapes = new HashSet<HashSet<Integer>>();
Set shape = new HashSet<Integer>();
由于 C# 中没有 Set,我的初始化是:
HashSet<HashSet<int>> shapes = new HashSet<HashSet<int>>();
HashSet<int> shape = new HashSet<int>();
不确定这是否会产生影响。
最佳答案
最简单的方法是制作自己的EqualityComparer
,尽管它可能不是最有效的方法
示例
public class MyComparer : IEqualityComparer<HashSet<int>>
{
public bool Equals(HashSet<int> x, HashSet<int> y)
=> x?.SetEquals(y) ?? false;
public int GetHashCode(HashSet<int> obj)
{
unchecked
{
return obj.Aggregate(17, (current, item) => current * 31 + item.GetHashCode());
}
}
}
使用
var rand = new Random();
var hashes = Enumerable.Range(0, 20)
.Select(x => new HashSet<int>(Enumerable.Range(0, 3)
.Select(y => rand.Next(0, 5))));
var hashList = new HashSet<HashSet<int>>(hashes, new MyComparer()) ;
foreach (var list in hashList)
Console.WriteLine(string.Join(", ",list));
输出
2, 0
3, 1
0, 1, 4
0, 2, 1
0, 3
4, 0, 3
4, 3
0, 1
1, 2
4, 3, 1
2, 1, 0
2
3, 1, 4
3, 2
4, 1, 3
0, 2
1, 4
1, 3
关于java - HashSet<HashSet<int>> 在 Java 中不允许重复,但在 C# 中允许,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60733086/