【问题标题】:How do I get the list of keys in a Dictionary?如何获取字典中的键列表?
【发布时间】:2010-11-19 14:11:39
【问题描述】:

我只想要字典的键而不是值。

我还没有获得任何代码来执行此操作。使用另一个数组被证明是太多的工作,因为我也使用 remove。

如何获取字典中的键列表?

【问题讨论】:

    标签: c# list dictionary


    【解决方案1】:
    List<string> keyList = new List<string>(this.yourDictionary.Keys);
    

    【讨论】:

    • 有必要用“this”吗?
    • @JerryGoyal 不,没有必要。它只是用来消除关于yourDictionary 是对象的一部分、派生于函数还是参数名称的混淆。
    • 更完整的答案是不要假设 Key 类型是字符串。 var keyList = yourDictionary.Keys.ToList();或者,如果您想发疯而不使用 var 或 Linq: - 键入 keyType = yourDictionary.GetType().GetGenericArguments()[0];类型 listType = typeof(List).MakeGenericType(keyType); IList keyList = (IList)Activator.CreateInstance(listType); keyList.AddRange(yourDictionary.Keys);
    【解决方案2】:

    你应该可以只看.Keys

        Dictionary<string, int> data = new Dictionary<string, int>();
        data.Add("abc", 123);
        data.Add("def", 456);
        foreach (string key in data.Keys)
        {
            Console.WriteLine(key);
        }
    

    【讨论】:

    • 如果您要删除循环中的键怎么办?
    • @MartinCapodici 那么您通常应该期望迭代器中断并拒绝继续
    • Marc,是的,所以在这种情况下,你会像其他答案一样做一些事情并创建一个新列表。
    【解决方案3】:

    .NET 3.5+ 的更新

    获取所有键的列表:

    using System.Linq;
    
    List<String> myKeys = myDict.Keys.ToList();
    

    如果您在使用 System.Linq 时遇到任何问题,请参阅以下内容:

    【讨论】:

    • 请不要忘记:using System.Linq; 我需要知道哪些答案可以忽略。对不起:)
    • 谢谢@Bitterblue。我不明白为什么 .ToList() 在我使用了这么多次时会抛出错误,所以我来到这里寻找答案,我意识到我正在使用的文件没有 using System.Linq :)
    • 不起作用:Dictionary&lt;string, object&gt;.KeyCollection' does not contain a definition for 'ToList'
    • 确实不起作用。改用接受的答案。
    • @aleck 效果很好。您可能没有按照 Bitterblue 的建议使用 System.Linq,或者您使用的 .Net 框架版本不支持它。它是在 .Net 框架 3.5 中引入的,请参见 link。在使用此方法之前,我正在更新使用 System.Linq 的答案。
    【解决方案4】:

    Marc Gravell 的回答应该适合您。 myDictionary.Keys 返回一个实现 ICollection&lt;TKey&gt;IEnumerable&lt;TKey&gt; 及其非泛型对应对象的对象。

    我只是想补充一点,如果您也打算访问该值,则可以像这样遍历字典(修改示例):

    Dictionary<string, int> data = new Dictionary<string, int>();
    data.Add("abc", 123);
    data.Add("def", 456);
    
    foreach (KeyValuePair<string, int> item in data)
    {
        Console.WriteLine(item.Key + ": " + item.Value);
    }
    

    【讨论】:

      【解决方案5】:

      我无法相信所有这些令人费解的答案。假设密钥的类型为:字符串(如果您是懒惰的开发人员,请使用 'var'):-

      List<string> listOfKeys = theCollection.Keys.ToList();
      

      【讨论】:

      • 你的意思是它不起作用? Dictionary 具有 KeyCollection 类型的键属性,它实现了具有 ToList() 扩展方法的 ICollection。将 System.Linq 添加到您的“使用”语句中,您应该会很好。 using System.linq;
      【解决方案6】:

      这个问题有点难以理解,但我猜问题是您在迭代键时试图从字典中删除元素。我认为在这种情况下你别无选择,只能使用第二个数组。

      ArrayList lList = new ArrayList(lDict.Keys);
      foreach (object lKey in lList)
      {
        if (<your condition here>)
        {
          lDict.Remove(lKey);
        }
      }
      

      如果您可以使用通用列表和字典而不是 ArrayList,那么我会的,但是上面应该可以正常工作。

      【讨论】:

        【解决方案7】:

        或者像这样:

        List< KeyValuePair< string, int > > theList =
            new List< KeyValuePair< string,int > >(this.yourDictionary);
        
        for ( int i = 0; i < theList.Count; i++)
        { 
          // the key
          Console.WriteLine(theList[i].Key);
        }
        

        【讨论】:

        • 这会创建密钥的副本吗? (以便您可以安全地枚举)
        • 那是重写 .ToList() linq 扩展。此外,KeyValuePair 的列表是一个字典。最初的请求只是一个密钥列表。使用循环来填充是不必要的,因为 List 有一个构造函数,它接受一个集合,并且还有一个 AddRange() 方法可以添加到现有的 List 中。查看接受的答案。
        【解决方案8】:

        对于混合字典,我使用这个:

        List<string> keys = new List<string>(dictionary.Count);
        keys.AddRange(dictionary.Keys.Cast<string>());
        

        【讨论】:

          【解决方案9】:

          我经常使用它来获取字典中的键和值:(VB.Net)

           For Each kv As KeyValuePair(Of String, Integer) In layerList
          
           Next
          

          (layerList 的类型是 Dictionary(Of String, Integer))

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-29
            相关资源
            最近更新 更多