在哈希集字典中查找值的组合



我有一个Dictionary<string, HashSet<string>>,我想通过它找到 HashSet 中的所有组合,没有任何重复。例如(虚拟数据):

Keys          Values (HashSet)
"greeting"     "Hello" "Hi" "Hey" "Howdy" ...
"Name"         "Tom" "Angel" "Edward" ...
"question"     "how are you?" "can you help me?" "is everything okay?" ...
    ...                  ...
    ...                ....

我希望输出是某种集合,每个值为:

"Hello Tom how are you?"
"Hello Tom can you help me?"
"Hello Tom is everything okay?"
"Hello Angel how are you?"
"Hello Angel can you help me?"
"Hello Angel is everything okay?"
"Hello Edward how are you?"
...
"Hi Tom how are you?"
"Hi Tom can you help me?"
"Hi Tom is everything okay?"
"Hi Angel how are you?"
...

我希望它尽可能抽象,我可以根据需要在哈希集中添加任意数量的键和值。

尝试过递归地做到这一点,但我对此不太强,我无法想出一个基本情况......我认为你可以用 linq 做到这一点,但我根本不熟悉 linq。

我使用Dictionary<string, HashSet<string>>的原因是因为我收集信息的方式,所以我想保留这个数据结构。

谢谢!

给定问题中提供的示例数据:

var data = new Dictionary<string, HashSet<string>>
{
    {"greeting", new HashSet<string> {"Hello", "Hi", "Hey", "Howdy"}},
    {"Name", new HashSet<string> {"Tom", "Angel", "Edward"}},
    {"question", new HashSet<string> {"how are you?", "can you help me?", "is everything okay?"}}
};

如果没有任意键,下面是使用 LINQ 执行此操作的简单方法:

var collection = from g in data["greeting"]
    from n in data["Name"]
    from q in data["question"]
    select string.Format("{0} {1} {2}", g, n, q);

使用此答案中的CartesianProduct扩展方法将如下所示:

var collection = data.Select(x => x.Value).CartesianProduct().Select(x => x.Aggregate((a, b) => a + " " + b));

无论哪种情况,我都foreach用于在控制台应用中显示输出:

foreach (var line in collection)
{
    Console.WriteLine(line);
}
一个简单的

解决方案是...

Dictionary<string, HashSet<string>> test = new Dictionary<string, HashSet<string>>();
        test.Keys.ToList().ForEach(key =>
        {
            test[key].ToList().ForEach(value => Console.WriteLine("key key:" + "value:" + value));
        });

最新更新