ToDictionary()是否创建副本或引用?

齿

关于ToDictionary()的MSDN文档并未详细说明其实际工作方式。我想知道它是创建字典及其元素的副本,还是仅重用相同的引用和枚举器。

举例来说,如果我有一个ConcurrentDictionary c,和我创建了一个词典d调用c.ToDictionary(...),我可以使用(认为foreachd线程更新的独立(在一个线程安全的方式)c

事实上,当我这样做时,我得到:

收藏集已修改;枚举操作可能无法执行。

...序列化时d

生殖腺炎

Enumerable.ToDictionary 创建您收藏的浅表副本。

您可以在.NET参考源中看到此行为

public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey> comparer)
{
    if (source == null) throw Error.ArgumentNull("source");
    if (keySelector == null) throw Error.ArgumentNull("keySelector");
    if (elementSelector == null) throw Error.ArgumentNull("elementSelector");
    Dictionary<TKey, TElement> d = new Dictionary<TKey, TElement>(comparer);
    foreach (TSource element in source) d.Add(keySelector(element), elementSelector(element));
    return d;
}

如您所见,它将创建一个new Dictionary,对您的集合进行迭代,并应用选择器功能将所有元素添加到其中。因此,如果您更新原始收藏,则字典将不会更新,反之亦然。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用元素索引而不是值副本创建数组引用

JS:Object.assign()是否创建深层副本或浅层副本

每个循环的Java是否返回引用或引用副本?

如何创建具有不同引用的相同对象的副本?

取消引用结构是否会返回该结构的新副本?

“只读”修饰符是否创建字段的隐藏副本?

是否存在无法为其创建深层副本的对象?

访问MemoryCache是否会创建副本?

如何创建以下数组而不是引用的副本?

引用numpy错误而不创建昂贵的副本

变量声明,它是否创建对实际对象或副本的引用?

&* x操作是否创建副本?

forEach是否在循环之前创建数组的深层副本?

绑定是否创建函数的新副本?

C ++标准:按副本返回以初始化不带RVO的引用:是否有副本?

loc / iloc是否返回引用或副本?

取消引用参数会创建它的本地副本吗?

std :: vector是否具有引用的副本构造函数?

LINQ Enumerable查询是否返回副本或引用?

如何识别创建只读副本操作是否完成和完成

String.Intern方法是否只是将对字符串的引用添加到内部缓冲池中,还是会创建字符串的副本?

我是否必须为线程需要创建对象的副本

切片“ a”(例如,“ a [1:] == a [:-1]”)是否会创建“ a”的副本?

dict __getitem__是否会创建相应对象的副本?

创建列表的副本,不引用所包含的对象

String(byte [])是否创建字节数组的深层副本?

如何在javascript中创建json对象的副本,而不是引用

Copy TBytes 是否会创建 TRUE 副本?

创建从 ToDictionary() 派生的扩展方法