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


152

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

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

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

Answers:


305
List<string> keyList = new List<string>(this.yourDictionary.Keys);

6
是否有必要使用“ this”。
JerryGoyal 2015年

15
@JerryGoyal不,没有必要。它仅用于清除关于yourDictionary对象是对象的一部分,从函数派生的名称还是参数名称的混淆。
bcdan 2015年

1
一个更完整的答案是不要假设Key type是字符串。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);
安东尼·布斯,

70

您应该可以看一下.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);
    }

2
如果要删除循环中的键怎么办?
Martin Capodici

5
@MartinCapodici,那么您通常应该期望迭代器中断并拒绝继续
Marc Gravell

5
马克,是的,因此在这种情况下,您会做其他答案一样的事情并创建一个新列表。
Martin Capodici

43

获取所有键的列表

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

.Net Framework 3.5或更高版本支持System.Linq。如果在使用System.Linq时遇到任何问题,请参见以下链接

Visual Studio无法识别System.Linq

System.Linq命名空间


13
请不要忘记:using System.Linq;我需要知道忽略哪些答案。抱歉:)
Bitterblue

2
谢谢@Bitterblue。我不明白为什么.ToList()这么多次使用它会引发错误,所以我来到这里寻找答案,我意识到我正在使用的文件没有using System.Linq:)
Drew

1
不起作用:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
sakra

确实不起作用。请改用接受的答案。
aleck

1
@aleck很棒。您可能未按照所使用的Bitterblue或.Net Framework版本的建议使用System.Linq,它不支持它。它是在.Net framework 3.5中引入的,请参见此链接。我正在更新使用此方法之前使用System.Linq的答案。

12

马克·格雷夫(Marc Gravell)的答案应该对您有用。myDictionary.Keys返回一个对象实现ICollection<TKey>IEnumerable<TKey>和他们非通用同行。

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

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

3

这个问题很难理解,但我想问题是您在遍历键的同时试图从字典中删除元素。我认为在这种情况下,您别无选择,只能使用第二个数组。

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

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


2

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

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

这是什么意思?字典具有KeyCollection类型的键属性,该属性实现具有ToList <>()扩展方法的ICollection。将System.Linq添加到您的“使用”语句中,您应该会很好。 using System.linq;
安东尼·布斯,

0

或像这样:

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

这会创建密钥的副本吗?(以便您可以安全地枚举)
mcmillab 2012年

那就是重写.ToList <T>()linq扩展名。同样,KeyValuePair列表也是一个字典。原始请求仅要求提供密钥列表。不需要使用循环来填充,因为List具有一个构造函数,该构造函数接受一个集合,并且还具有AddRange()方法以添加到现有List中。请参阅已接受的答案。
安东尼·布斯,

0

对于混合字典,我使用以下代码:

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

-2

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

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

 Next

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.