将字典值转换为数组


81

将字典的值列表转换为数组的最有效方法是什么?

举例来说,如果我有一个Dictionary地方KeyStringValueFoo,我想Foo[]

我正在使用VS 2005,C#2.0

Answers:


125
// dict is Dictionary<string, Foo>

Foo[] foos = new Foo[dict.Count];
dict.Values.CopyTo(foos, 0);

// or in C# 3.0:
var foos = dict.Values.ToArray();

扩展.ToArray <Foo>()的性能更好吗?
Goran

但是我们怎么知道它是最有效的呢?
汤姆·卡特

2
@Tom我通常认为框架中内置的任何内容(例如.CopyTo()或.ToArray())都是最有效的方法。微软公司比我聪明。:)
马特·汉密尔顿

5
ToArray的性能不如CopyTo(它使用CopyTo复制到内部中间表示形式,然后再次复制以将其返回)。但是,与所有与微性能相关的问题一样,它的可读性,鲁棒性和可维护性也很重要,如果存在问题,则要衡量性能。
ICR

16
ToArray()是LINQ中的扩展方法,因此您需要添加using System.Linq;
ChristianDavén2014年

12

将其存储在列表中。更容易

List<Foo> arr = new List<Foo>(dict.Values);

当然,如果您特别希望将其放在数组中;

Foo[] arr = (new List<Foo>(dict.Values)).ToArray();

6

在值上有一个ToArray()函数:

Foo[] arr = new Foo[dict.Count];    
dict.Values.CopyTo(arr, 0);

但是我认为它的效率不高(我还没有真正尝试过,但是我想它会将所有这些值复制到数组中)。您真的需要一个数组吗?如果没有,我将尝试通过IEnumerable:

IEnumerable<Foo> foos = dict.Values;

4

如果您想使用linq,则可以尝试以下操作:

Dictionary<string, object> dict = new Dictionary<string, object>();
var arr = dict.Select(z => z.Value).ToArray();

我不知道哪个更快或更更好。两者都为我工作。


2
dict.Values.ToArray()做同样的事情,但是没有通过委托实现每个值的开销。
培根

1

如今,一旦有了LINQ,就可以将字典键及其值转换为单个字符串。

您可以使用以下代码:

// convert the dictionary to an array of strings
string[] strArray = dict.Select(x => ("Key: " + x.Key + ", Value: " + x.Value)).ToArray();

// convert a string array to a single string
string result = String.Join(", ", strArray);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.