我需要用一个字符串键和一个字符串列表作为值的字典,并找到它可以进行的所有组合。 例如:
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 },
};
我得到这个结果:
经过进一步思考,这里有一种方法可以计算字典中任意数量的元素(即不仅仅是“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/