【问题标题】:Finding the combinations of values in a dictionary of hashsets在哈希集字典中查找值的组合
【发布时间】:2015-04-13 15:01:12
【问题描述】:

我有一个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>> 的原因是因为我收集信息的方式,所以我想保留这个数据结构。

谢谢!

【问题讨论】:

  • 搜索“排列”。
  • @CoderDennis:这不是我想要的,我想用一个哈希集字典来做到这一点,我对如何处理这个问题感到困惑。我还想用第二个键的哈希集的第一个值来获取第一个键的哈希集的第一个值,依此类推,直到我到达最后一个哈希集,然后再做一遍,除了最后一个哈希的第二个值...... . 我不知道这是否有意义
  • 这正是该问题的答案所显示的。您的输出不使用密钥,因此不会改变任何内容。只考虑你的价值观,你基本上得到了IEnumerable<IEnumerable<string>>

标签: c# linq dictionary recursion combinatorics


【解决方案1】:

鉴于问题中提供的示例数据:

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);

使用this answer 中的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);
}

【讨论】:

    【解决方案2】:

    一个简单的解决方案是......

    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));
            });
    

    【讨论】:

    • 这不是我想要的,我不想只打印与键关联的哈希集的值,我想打印所有键的哈希集值的所有组合.就像第一个键的哈希集的第一个值与第二个键的哈希集的第一个值等等。
    • 您应该提供更多代码。您需要定义一个列表,其中包含您想要置换的值和顺序。
    猜你喜欢
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2017-08-04
    • 2016-08-31
    相关资源
    最近更新 更多