Refactor Permutations method in EnumerableExtensions to remove unnecessary logic and add validation for output count in tests
This commit is contained in:
@@ -41,37 +41,26 @@ public static class EnumerableExtensions
|
||||
var pool = values.ToArray();
|
||||
if (count > pool.Length)
|
||||
yield break;
|
||||
foreach (var p in InnerPermutations(pool, count))
|
||||
yield return p;
|
||||
|
||||
foreach (var p in InnerPermutations([..pool.Reverse()], count))
|
||||
yield return p;
|
||||
yield break;
|
||||
|
||||
static IEnumerable<TValue[]> InnerPermutations(TValue[] pool, int count)
|
||||
var indices = Enumerable.Repeat(0, count).ToArray();
|
||||
yield return GetCombination(indices, pool);
|
||||
while (true)
|
||||
{
|
||||
var indices = Enumerable.Repeat(0, count).ToArray();
|
||||
yield return GetCombination(indices, pool);
|
||||
while (true)
|
||||
var idx = count - 1;
|
||||
for(;idx > 0; --idx)
|
||||
{
|
||||
var idx = count - 1;
|
||||
for(;idx >= 0; --idx)
|
||||
{
|
||||
var isIndexBelowMax = indices[idx] != idx + pool.Length - count;
|
||||
if (isIndexBelowMax)
|
||||
break;
|
||||
}
|
||||
if(idx < 0)
|
||||
var isIndexBelowMax = indices[idx] != idx + pool.Length - count;
|
||||
if (isIndexBelowMax)
|
||||
break;
|
||||
|
||||
indices[idx] += 1;
|
||||
for (var j = idx + 1; j < count; j++)
|
||||
{
|
||||
indices[j] = indices[j - 1];
|
||||
}
|
||||
|
||||
yield return GetCombination(indices, pool);
|
||||
}
|
||||
if(indices.All(i => i >= pool.Length - 1))
|
||||
yield break;
|
||||
indices[idx] += 1;
|
||||
for (var j = idx + 1; j < count; j++)
|
||||
{
|
||||
indices[j] = 0;
|
||||
}
|
||||
|
||||
yield return GetCombination(indices, pool);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user