在 C# 中将字典映射到数组的最快方法

Posted

技术标签:

【中文标题】在 C# 中将字典映射到数组的最快方法【英文标题】:Fastest way to map Dictionary to array in C# 【发布时间】:2019-08-08 17:51:18 【问题描述】:

将具有整数索引的字典转换为数组以使数组索引为字典索引的最快方法是什么?您可以假设 Dictionary 包含从 0 到最大键的所有元素。

例子:

dictionary[2] = z
dictionary[0] = x
dictionary[1] = y

转换后我需要:

array[0] = x
array[1] = y
array[2] = z

【问题讨论】:

使用 LINQ 你可以像 myDict.Select(x => x.Value).ToArray(); @apomene 这不能保证键值是有序的。我相信对于从 0 到最大键值的所有 n,OP 希望 dictionary[n] 中的值等于 array[n] 中的值。 字典存储为二叉树,所以索引真的没有多大意义。除非您要打印表格,否则为什么有人会将索引与字典一起使用。 【参考方案1】:

如果字典中的键/值包含数组中的索引,您希望将值放入其中,您只需遍历字典并将值插入特定索引即可。

Dictionary<int, string> keyValuePairs = new Dictionary<int, string>();
string[] arr = new string[keyValuePairs.Count];

foreach (KeyValuePair<int, string> item in keyValuePairs)
    arr[item.Key] = item.Value;

如果您的索引没有像@TanvirArjel 建议的那样均匀递增 - 您应该首先找到最大索引,这意味着将第二行替换为以下内容:

string[] arr = new string[keyValuePairs.Keys.Max() + 1];

在速度方面,使用非惰性编程并定义类型总是更好。迭代时(支持参数如下)与使用 vars 相比,您将获得较小的性能提升。

有一篇很棒的 Microsoft 文章 here 比较了迭代方式及其在字典上的速度。

【讨论】:

如果Dictionary Key没有均匀增加会抛出index out of range @TanvirArjel 它会,但这不是 OP 问题的一部分,问题是“字典包含从 0 到最大键的所有元素”,表明它们是一致存在的。不过,记住 OP 是一件好事。随意编辑答案。 其实你想要new string[keyValuPars.Keys.Max() +1],因为索引从0开始,所以大小比最大索引大一。 @juharr 对不起,你是对的。当我发表第一条评论时,我查看了第一个示例。 但是用 var 替换 string[] 会带来任何性能提升吗? var 可以在类实现接口的某些情况下产生一些影响,例如:IA a = new A(); var a = new A();正如你所说的这种情况有些不同..

以上是关于在 C# 中将字典映射到数组的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中将二维数组归零的最快方法是啥?

在 python 中将 4D 数组与 2D 数组相乘和求和的最快方法?

将第一个元素移动到数组末尾的最快方法

在c ++中将4个字节转换为float的最快方法

在 C# 中计算数组频率分布的最快方法是啥?

vba多表合sql,数组,字典并哪种最快