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

Posted

技术标签:

【中文标题】如何将字典的值复制到 .Net 2.0 中的 IList 对象中?【英文标题】:How do I Copy the Values of an IDictionary into an IList Object in .Net 2.0? 【发布时间】:2009-04-21 01:57:42 【问题描述】:

如果我有:

Dictionary<string, int>

如何将所有值复制到:

List<int> 

对象?

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

有没有更好的办法?

【问题讨论】:

【参考方案1】:

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

您可以轻松地遍历 MyDictionary.Values 的 ICollection。

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

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

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

它将您要编写的代码包装到一个复制构造函数中,该构造函数已经实现了您计划编写的代码。那是代码行效率,这可能是您真正关心的;它并不比你写的更节省空间或时间。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

试试下面的

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

【讨论】:

IIRC C# 2.0 无法推断通用类型,因此您必须在调用中指定它们:Util.CopyValues(map) @Guffa,我的代码可以在 C# 2.0 及更高版本中运行。 C# 在 2.0 中无法进行本地类型推断,但仍然可以进行方法类型推断。【参考方案4】:

如果您可以使用IEnumerable&lt;int&gt;ICollection&lt;int&gt; 而不是List&lt;int&gt;,您可以直接使用字典中的Value 集合,而无需复制任何内容。

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

【讨论】:

以上是关于如何将字典的值复制到 .Net 2.0 中的 IList 对象中?的主要内容,如果未能解决你的问题,请参考以下文章

使用asp.net 2.0中的SqlBulkCopy类批量复制数据

如何按字典中的值对字典列表进行排序? [复制]

如何在 .NET 2.0 中异步复制文件?

我们如何访问以列表形式存在的字典中的值? [复制]

如何按 .NET 2.0 中的特定属性对列表进行排序? [复制]

pandas:如何将字典转换为转置数据框? [复制]