【发布时间】:2015-09-10 17:19:32
【问题描述】:
我看到了很多类似的问题,但是在这里没有找到我真正需要的东西。任何帮助表示赞赏。
我有一组键 (K[1..M]),每个键 K[i] 可以映射到此特定键 K[i]:V[i,1 的一组可用值中的任何值..Ni]
K[1]: V[1,1] | V[1,2] ... | V[1,N1]
K[2]: V[2,1] | V[2,2] ... | V[1,N2]
...
K[M]: V[M,1] | V[M,2] ... | V[1,NM]
我需要实现 RECURSIVE 函数,返回 K-V 映射的所有可能组合的可枚举
例如: 给定集合:
K1: 1 | 2 | 3
K2: 4 | 1
组合如下:
(K1:1, K2:4)
(K1:2, K2:4)
(K1:3, K2:4)
(K1:1, K2:1)
(K1:2, K2:1)
(K1:3, K2:1)
理想的函数应该是这样的:
IEnumerable<Dictionary<TKey, TValue>> EnumerateAllPossibleCombinations(IEnumerable<TKey> keys, Func<TKey, IEnumerable<TValue>> getAvailableValuesForKey)
{
...
yield return ...;
}
函数的使用(代码草案):
var allCombinations = EnumerateAllPossibleCombinations<string, int>(new[]{"K1","K2"}, k=>{
switch k
{
case "K1": return new[]{1,2,3};
case "K2": return new[]{4,1};
}
ThrowException("Unknown key");
});
例如上面的结果应该是 6 个字典,每个字典有 2 个键值对
我试图避免使用笛卡尔积,因为我需要在字典之后接收字典(allCombinations.ElementAt(1)、allCombinations.ElementAt(2)),而笛卡尔必须完全执行所有组合才能执行返回第一个字典。
【问题讨论】:
-
你需要 Func 做什么?这不是您的主要功能中的另一个循环吗?还是您打算传入谓词?
-
因此对于您的示例,您希望它返回 6 个字典,每个字典有两个条目?
-
我根据您的 cmets 更新了问题文本并添加了更多说明。
-
为什么人们不赞成这个问题?有什么问题??
标签: c# algorithm combinations combinatorics