生成通用列表的组合

2024-02-11

我需要从另一个列表创建一个列表,其中包含所有可能的组合。在研究可能的解决方案时,我发现了许多有趣的方法,但所有方法似乎都是根据提供的记录计数生成结果。我需要将组合增加到最大阈值。

即考虑以下数组

1,2,3,4,5

我需要结果看起来类似于(本例中阈值为 3)

1
1,2
1,2,3
1,2,4
1,2,5
1,3,4
2,3,5... etc

实际上,数据将是 IEnumerable。我使用一个简单的 int[] 来说明所需的结果。


我的解决方案使用简单的递归算法来创建组合:

  • 当我们遍历序列时,我们可以立即返回一个仅保存当前值的序列。我编写了一个简单的扩展方法来为单个项目创建 IEnumerable。

  • 接下来,我们以阈值减 1 的方式递归生成剩余元素的所有组合,并将它们与当前值组合。

我假设元素不应重复(即不允许使用 { 1, 1 } 或 { 1, 2, 1 } )。如果你想允许重复的元素,你可以删除remaining变量并将其替换为values在递归调用中GetCombinations.

请注意使用yield http://msdn.microsoft.com/library/9k7k7cf0.aspx关键词。这意味着代码使用了延迟执行。在实际枚举结果之前无需存储任何中间结果。

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生成通用列表的组合 的相关文章

随机推荐