【发布时间】:2015-09-09 14:42:56
【问题描述】:
我想知道这两种在C#中迭代Dictionary集合的方式的细节:
Dictionary<X, Y> xydic = new Dictionary<X, Y>();
样式一:
foreach (Y y in xydic.Values) { use y }
样式二:
foreach (var it in xydic) { Y y = it.Value; use y... }
多年来,我一直是 C++ 开发人员(现在我在一个 C# 项目中工作),我不知道 Dictionary 集合如何工作、内存布局或元素如何迭代的细节,所以我我想知道:
xydic.Values 创建一个临时的List<Y>?我在the documentation 中没有看到任何有关创建临时列表的信息。
如果创建了一个临时列表,这是否意味着该集合被迭代了两次:第一次创建List<Y>,第二次迭代列表本身?
如果上述问题的答案是肯定的,那么第二种样式应该更有效,使第一种样式几乎无用,所以我认为我在某种程度上应该是错误的。
我觉得这个问题应该在某个地方得到回答,但我找不到答案。
【问题讨论】:
-
在 C# 中,您不必担心内存问题。垃圾收集器将为您完成这项工作。如果你真的想看看
Dictionary类是如何执行.Values或其他函数的,你可以用IlSpyapp 打开它,然后看代码 -
您可以查看source 以了解其具体实现方式。
-
@Jasper 我更关心的是
Values是否创建了一个临时列表(这意味着该集合被迭代了两次)。当我提到我不知道内存布局时,如果我知道,我可以自己推断出答案:) -
@PaperBirdMaster 你为什么不简单地检查来源 - referencesource.microsoft.com/#mscorlib/system/collections/… ?
-
创建一个临时列表(意味着集合被迭代两次):) :) 典型的 C++ 问题 :) :) 在 C# 中你有垃圾收集器 - 不要过多考虑内存分配 - 只是让 GC 完成它的工作
标签: c# foreach iteration containers