【问题标题】:Get all Keys from a MultiDictionary从多字典中获取所有键
【发布时间】:2016-12-18 00:15:26
【问题描述】:

我正在寻找一种方法来获取 multiDictionary 的所有 FIRST 级密钥,但我完全无法获取它们(用于调试目的)

我这样声明字典:

        private Dictionary<string, Dictionary<string, Packet>> PacketsStore = new Dictionary<string, Dictionary<string, Packet>>();

那么我怎样才能打印出所有基本键的列表呢?

如果我以后需要它,我怎么能打印出二级密钥...

提前致谢!

【问题讨论】:

  • PacketsStore.Keys?

标签: c# dictionary key


【解决方案1】:

第一层,众所周知的方式:

var allKeys = PacketsStore.Keys;

子字典键,LINQ方式:

var allSubKeys = PacketsStore.SelectMany(pair => pair.Value.Keys);

OP 已注释掉其他答案,即两个嵌套的 foreach 循环更适合调试目的,但毕竟,如果 OP 想要将所有子键输出到控制台,仍然可以使用单行解决方案:

// One-liner solution!
PacketsStore.SelectMany(pair => pair.Value.Keys).ToList().ForEach(Console.WriteLine);

【讨论】:

    【解决方案2】:
    foreach(KeyValuePair<string, Dictionary<string, Packet>> entry in PacketsStore)
    {
        string key = entry.Key; // first level
        foreach(KeyValuePair<string, Packet> entryInner in entry.Value)
        {
           string keyInner = entryInner.Key // second level
        }
    }
    

    我已将键放入变量中,您可以将其放入某些集合中。目的是获取钥匙:)

    【讨论】:

    • 引发异常:'System.Collections.Generic.KeyNotFoundException' in mscorlib.dll... 执行packetsStore.count() 会返回0... 所以也许我的问题在于字典为空!生病检查一下,然后回来!
    • @user3916429 在检查后看到更新的答案,这是一个愚蠢的错误
    • 是的,它运行良好,我也将提交固定代码 ^^ 我的问题来自我的字典总是空的这一事实......现在它运行良好并且 yoru 代码正在运行 :) 我会只需添加一个空字典检查以确保安全。谢谢
    • @user3916429 你真的更喜欢使用显式双精度 foreach 而不是 Enumerable.SelectMany 来获取子键吗?
    • @MatíasFidemraizer 抱歉,这仅用于调试目的,所以我可以简单地将所有字典转储到控制台。仅出于此目的更容易,但是如果有人只需要获取子密钥而不循环通过第一个密钥对,那么使用您的Enumerable.SelectMany 将更容易在内部代码中使用!
    【解决方案3】:

    对于所有键,请尝试:

    var keys = PacketsStore.Keys.ToArray();
    

    对于二级密钥:

    List<string> secondaryKeys;
    foreach (var key in keys)
    {
         secondaryKeys.AddRange(PacketStore[key].Keys.ToArray());
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-14
      • 2016-08-08
      • 1970-01-01
      • 2016-05-27
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多