私のソリューションでは、単純な再帰アルゴリズムを使用して組み合わせを作成します。
要素が繰り返されるべきではないと仮定します (つまり、{ 1, 1 } または { 1, 2, 1 } は許可されません)。要素の繰り返しを許可したい場合は、変数を削除して、 への再帰呼び出しで にremaining
置き換えることができます。values
GetCombinations
yield
キーワードの使用に注意してください。これは、コードが遅延実行を使用することを意味します。実際に結果を列挙する前に、中間結果を保存する必要はありません。
public static IEnumerable<IEnumerable<T>> GetCombinations<T>(IEnumerable<T> values, int threshold)
{
var remaining = values;
foreach (T value in values)
{
yield return value.Yield();
if (threshold < 2)
{
continue;
}
remaining = remaining.Skip(1);
foreach (var combination in GetCombinations(remaining, threshold - 1))
{
yield return value.Yield().Concat(combination);
}
}
}
public static IEnumerable<T> Yield<T>(this T item)
{
yield return item;
}
整数配列 { 1, 2, 3, 4, 5 } の出力は次のとおりです。
1
1, 2
1, 2, 3
1, 2, 4
1, 2, 5
1, 3
1, 3, 4
1, 3, 5
1, 4
1, 4, 5
1, 5
2
2, 3
2, 3, 4
2, 3, 5
2, 4
2, 4, 5
2, 5
3
3, 4
3, 4, 5
3, 5
4
4, 5
5