C# 试图从.NET字典中提取密钥列表

C# 试图从.NET字典中提取密钥列表,c#,.net,dictionary,C#,.net,Dictionary,怀疑我的大脑今天不工作-我需要提取一个密钥列表,等等: Dictionary<string, MyClass> myDict; List<String> myKeys = myDict.Keys; 字典myDict; List myKeys=myDict.Keys; 第二行无法编译,因为Keys属性返回一个“KeyCollection”类,而不是键对象列表。使用LINQ可以执行以下操作 List<String> myKeys = myDict.Keys.

怀疑我的大脑今天不工作-我需要提取一个密钥列表,等等:

Dictionary<string, MyClass>  myDict;
List<String> myKeys = myDict.Keys;
字典myDict;
List myKeys=myDict.Keys;

第二行无法编译,因为Keys属性返回一个“KeyCollection”类,而不是键对象列表。

使用LINQ可以执行以下操作

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

但是,根据您对键的目标(选择性枚举等),使用键集合而不是转换为列表可能更有意义。

是的,您可以尝试-
IEnumerable myKeys=myDict.keys

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

最好使用
IEnumerable
(一种更通用的类型)。

如果需要真正的列表:

List<string> myKeys = new List<string>(myDict.Keys);
List myKeys=新列表(myDict.Keys);

KeyCollection实现
IEnumerable
接口

可以使用扩展方法将其转换为列表

List<String> myKeys = myDict.Keys.ToList();
List myKeys=myDict.Keys.ToList();
或者使用不同的构造函数:

List<String> myKeys = new List<String>(myDict.Keys);
List myKeys=新列表(myDict.Keys);

我创建了一本简化词典:

使用系统;
使用系统集合;
使用System.Collections.Generic;
命名空间CS_库
{
公共密封类目录:I可满足,I可撤销
{
私有ArrayList键、值;
私有int LocalCount;公共int Count{get=>LocalCount;}
公开宣言
{
keys=newarraylist();
值=新的ArrayList();
}
公共Dict(ArrayList键、ArrayList值)
{
this.keys=keys;
这个值=值;
}
~Dict(){}
公共对象此[object key]{get=>值[keys.IndexOf(key)];}
public int Add(object key,object value)//更奇怪的是VisualStudio没有为“value”着色
{
if(key.IndexOf(key)>-1 | | values.IndexOf(value)>-1)
{
返回-1;
}
LocalCount=keys.Add(key);
返回值。添加(值);
}
公共无效替代(对象newKey、对象newValue、对象key)
{
if(key.IndexOf(newKey)>-1 | | values.IndexOf(newValue)>-1)
{
返回;
}
keys[keys.IndexOf(key)]=newKey;
值[keys.IndexOf(key)]=新值;
}
公共无效删除(对象键)
{
if(键索引of(键)=-1)
{
返回;
}
value.removet(key.IndexOf(key));
键。移除(键);
}
公共void DeleteAt(int索引)
{
如果(索引<0 | |索引>键数)
{
返回;
}
键。移除(索引);
移除值(索引);
}
公开作废删除()
{
值=空;
keys=null;
}
公共void重建(ArrayList NewKey、ArrayList newValues)
{
if(键!=null&&values!=null)
{
抛出新的InvalidOperationException(“此方法之前应该有'Erase()'方法,或者用'Queue_Rebuild()'方法代替此方法”);
}
键=新键;
值=新值;
}
公共无效队列\u重建(ArrayList newKeys、ArrayList newValues)
{
擦除();
重建(新键、新值);
}
公共覆盖布尔等于(对象对象对象)
{
返回等于(obj作为Dict);
}
公共布尔等于(Dict其他)
{
返回其他!=null&&
EqualityComparer.Default.Equals(键,其他.keys)&&
EqualityComparer.Default.Equals(值,其他.values)&&
LocalCount==other.LocalCount;
}
公共覆盖int GetHashCode()
{
返回HashCode.Combine(键、值、LocalCount);
}
公共重写字符串ToString()
{
字符串r=“{”;
bool first=true;
for(int i=0;i

它还没有完成,所以你可以做任何更改。

谢谢-这很漂亮:我需要掌握Linq的窍门!啊,所以我缺少的只是使用System.Linq我从未习惯所有这些突然出现的扩展方法…重复:可能重复的