Anjaniクマールアグラワル:
私はHashSetのは、重複する値を許可しないという事実を利用する問題に取り組んでいました。このため、Javaのソリューションは、複数の計算HashSet<int>
とに追加しHashSet<HashSet<int>>
、最終的にサイズを返します。この方法は、それはHashSetのすべての異なった組み合わせを取得します。私はC#でこれを実行しようとしたとき、私は明確なHashSetのを取得できませんでした。私は、デバッグと同じ値を持つ2つのHashSetのを見ることができます。以下のスクリーンショットで見ることができます。
だから、おそらくそれがなくても良く、多分私自身の比較演算子またはを使用してC#で同じ動作を取得する方法があります。私は自分自身の比較メソッドを作成しようとしましたが、HashSetのはそうではないことを確認2 HashSetsを比較する方法をインデックス化しているものではありません。それとも、C#では不可能なものです。私が気づいたことの一つは、Javaで初期化され、次のとおりです。
Set shapes = new HashSet<HashSet<Integer>>();
Set shape = new HashSet<Integer>();
Cには設定がありませんので、#私の初期化は次のとおりです。
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