c# - 如何制作一组新词典,其中包含以列表为值的词典中的所有可能组合

标签 c# dictionary combinations

我需要用一个字符串键和一个字符串列表作为值的字典,并找到它可以进行的所有组合。 例如:

var myDictionary = new Dictionary<string, List<string>>
{
    {"X", new List<string> {"x", "y", "z"}},
    {"Y", new List<string> {"x", "y"}},
    {"Z", new List<string> {"a", "b"}}
};

将转化为:

{X: x, Y: x, Z: a}
{X: x, Y: x, Z: b}
{X: x, Y: y, Z: a}
{X: x, Y: y, Z: b}
{X: y, Y: x, Z: a}
{X: y, Y: x, Z: b}
{X: y, Y: y, Z: a}
{X: y, Y: y, Z: b}
{X: z, Y: x, Z: a}
{X: z, Y: x, Z: b}
{X: z, Y: y, Z: a}
{X: z, Y: y, Z: b}

我怎样才能以最聪明的方式做到这一点?

最佳答案

这样做怎么样?

var combinations =
    from x in myDictionary["X"]
    from y in myDictionary["Y"]
    from z in myDictionary["Z"]
    select new Dictionary<string, string>()
    {
        { "X", x },
        { "Y", y },
        { "Z", z },
    };

我得到这个结果:

combinations


经过进一步思考,这里有一种方法可以计算字典中任意数量的元素(即不仅仅是“X”、“Y”和“Z”。)

Func<
    Dictionary<string, string>,
    Dictionary<string, string>,
    Dictionary<string, string>> merge = (d1, d2) =>
{
    var d = new Dictionary<string, string>(d1);
    foreach (var kv in d2)
    {
        d.Add(kv.Key, kv.Value);
    }
    return d;
};

var combinations =
    myDictionary
        .Select(x =>
            x.Value.Select(v =>
                new Dictionary<string, string>()
                {
                    { x.Key, v }
                }))
        .Aggregate((xs, vs) =>
            from x in xs
            from v in vs
            select merge(x, v));

关于c# - 如何制作一组新词典,其中包含以列表为值的词典中的所有可能组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26683203/

相关文章:

c# - 限制为程序集添加引用

java - 将结果集值放入 Collection 对象,然后添加到 ArrayList

php - 如何使用不同的数据库条目达到特定值(整数)?

java - 递归判断是否可以找到目标数

python - 从组合列表中选择对的最佳策略

c# - 选择后 ContextMenu 不会消失。

c# - Async GetAwaiter() 抛出奇怪的异常

c# - TPL Dataflow BufferBlock 线程安全吗?

java - 使用instanceof帮助和java强制转换类型异常会影响性能吗?

python - 检查一个单词是否在作为字典值的列表中