如何将字典的值复制到.Net 2.0中的IList对象中?

时间:2009-04-21 01:57:42

标签: c# .net generics performance c#-2.0

如果我有:

Dictionary<string, int>

如何将所有值复制到:

List<int> 

对象?

解决方案需要与2.0 CLR版本和C#2.0兼容 - 我真的没有更好的想法,除了循环遍历字典并逐个将值添加到List对象中。但这感觉非常低效。

有更好的方法吗?

4 个答案:

答案 0 :(得分:8)

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

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

foreach (int item in dict.Values) { dosomething(item); }

否则,如果您确实需要将其存储为IList,那么复制所有项目并不是特别低效;这只是一个O(n)操作。如果您不需要经常这样做,为什么要担心?如果您为编写代码而烦恼,请使用:

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

将您编写的代码包装到已经实现了您计划编写的代码的复制构造函数中。这是代码效率的线,这可能是你真正关心的;它没有比你写的更有空间或时间效率。

答案 1 :(得分:5)

这甚至可以在2.0上工作(原谅C#3.0使用“var”):

var dict = new Dictionary<string, int>();
var list = new List<int>(dict.Values);

答案 2 :(得分:1)

尝试以下

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

答案 3 :(得分:0)

如果您可以使用IEnumerable<int>ICollection<int>代替List<int>,则可以使用字典中的Value集合而无需复制任何内容。

如果您需要List<int>,则必须复制所有项目。列表的构造函数可以为您完成工作,但每个项目仍然需要复制,没有办法解决。