gpt4 book ai didi

c# - 生成通用列表的组合

转载 作者:太空狗 更新时间:2023-10-30 00:41:39 24 4
gpt4 key购买 nike

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

即考虑以下数组

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 变量,并在对 GetCombinations 的递归调用中将其替换为 values

请注意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

关于c# - 生成通用列表的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19188630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com