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

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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 时遇到任何问题,请参阅以下内容:

Visual Studio Does not recognize System.Linq System.Linq Namespace

【讨论】:

请不要忘记: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))

【讨论】:

以上是关于如何获取字典中的键列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用字典中的键获取索引?

获取以索引为导向的嵌套字典中的键和值列表

Python获取列表中键的键值

如何在 Django 模板中访问字典列表

如何从字典中检查特定字符串的键[重复]

Java中的Hashtable如何根据值获取键?