この問題を解決しようとして、金曜日のほとんどを失いました。
整数のコレクションから一意の順序付けられていないセットのリストを生成します。
[要素が元のコレクションで繰り返される場合、セットを構築する目的で 2 つの別個の要素と見なされます]
私は最終的に次のようになりました。これにより、正しい結果が得られます。もっと効率の良い方法がないか考え中です。
特に、私の Shift() メソッドは、より効率的な形式でどこかに存在する必要があります。私はビット単位の操作にあまり詳しくありません...しかし、おそらくここに当てはまりますか?
List<int[]> Unique(List<int> intList)
{
List<int[]> results = new List<int[]>();
bool[] toAdd = new bool[intList.Count];
toAdd[toAdd.Length - 1] = true;
int totalSets = (int)Math.Pow(2, intList.Count) - 1;
List<int[]> sets = new List<int[]>();
for (int i = 0; i < totalSets; i++)
{
int[] set = new int[toAdd.Count(p => p)];
int c = 0;
for (int j = toAdd.Length - 1; j >= 0; j--)
if (toAdd[j])
set[c++] = intList[j];
Shift(toAdd);
results.Add(set);
}
return results;
}
void Shift(bool[] array)
{
bool doShift = true;
for (int i = array.Length - 1; i >= 0; i--)
{
if (doShift)
array[i] = !array[i];
doShift = (doShift && !array[i]);
}
}