C# 如何将IDictionary的值复制到.NET2.0中的IList对象中?

C# 如何将IDictionary的值复制到.NET2.0中的IList对象中?,c#,.net,generics,performance,c#-2.0,C#,.net,Generics,Performance,C# 2.0,如果我有: Dictionary<string, int> 字典 如何将所有值复制到: List<int> 列表 反对 解决方案需要与2.0 CLR版本和C#2.0兼容——我真的没有更好的主意,除了循环遍历字典并将值逐个添加到列表对象中。但这感觉效率很低 有更好的方法吗?试试下面的方法 public static class Util { public List<TValue> CopyValues<TKey,TValue>(Dict

如果我有:

Dictionary<string, int>
字典
如何将所有值复制到:

List<int> 
列表
反对

解决方案需要与2.0 CLR版本和C#2.0兼容——我真的没有更好的主意,除了循环遍历字典并将值逐个添加到列表对象中。但这感觉效率很低

有更好的方法吗?

试试下面的方法

public static class Util {
  public List<TValue> CopyValues<TKey,TValue>(Dictionary<TKey,TValue> map) {
    return new List<TValue>(map.Values);
  }
}
Dictionary<string,int> map = GetTheDictionary();
List<int> values = Util.CopyValues(map);
公共静态类Util{
公共列表CopyValues(字典映射){
返回新列表(映射值);
}
}
然后可以使用如下方法

public static class Util {
  public List<TValue> CopyValues<TKey,TValue>(Dictionary<TKey,TValue> map) {
    return new List<TValue>(map.Values);
  }
}
Dictionary<string,int> map = GetTheDictionary();
List<int> values = Util.CopyValues(map);
Dictionary map=GetTheDictionary();
列表值=Util.CopyValues(映射);

即使在2.0上也应该可以使用(请原谅C#3.0中使用“var”):

var dict=newdictionary();
var列表=新列表(dict.Values);

如果您可以使用
IEnumerable
ICollection
而不是
列表
,则只需使用字典中的
集合,而无需复制任何内容


如果需要
列表
,则必须复制所有项目。列表的构造器可以为您完成这项工作,但每个项目仍然需要复制,这是无法避免的。

可能值得注意的是,您应该后退一步,问问自己是否真的需要存储在具有随机索引访问的列表中的项目,或者,如果您只需要不时地枚举每个键或值

您可以轻松地迭代MyDictionary.Values的ICollection

foreach (int item in dict.Values) { dosomething(item); }
否则,如果您确实需要将其存储为IList,那么复制所有项目并没有特别低效的地方;那只是一个O(n)操作。如果你不需要经常这样做,为什么要担心呢?如果您对编写这样做的代码感到恼火,请使用:

IList<int> x=new List<int>(dict.Values);
IList x=新列表(dict.Values);

它将您要编写的代码包装到一个副本构造函数中,该构造函数已经实现了您计划编写的代码。这就是高效的代码行,这可能是您真正关心的;它的空间和时间效率并不比您编写的代码高。

IIRC C#2.0无法推断出类型,因此您必须在调用中指定它们:Util.CopyValues(map)@Guffa,我的代码将在C#2.0及以上版本中工作。C#无法在2.0中进行局部类型推断,但仍可以进行方法类型推断。