将字典值转换为数组

95

如何将字典的值列表最有效地转换为数组?

例如,如果我有一个键是字符串类型而值是 Foo 类型 的 Dictionary,我想获得 Foo[] 数组。

我正在使用 VS 2005,C# 2.0。

5个回答

151
// 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
但是我们怎么知道它是最有效率的呢? - Tom Carter
我看不出ToArray()怎么可能比直接复制更快——这似乎是最简单的方法。 - Samuel Kim
4
我通常认为任何内置于框架中的东西(如.CopyTo()或.ToArray())都是最有效的方法。微软的人比我聪明。 :) - Matt Hamilton
6
ToArray 的性能比 CopyTo 差(它使用 CopyTo 将数据复制到一个内部中间表示形式,然后再次复制以返回)。然而,对于所有与微小性能相关的问题,应优先考虑可读性、健壮性和可维护性,如果性能成为问题,则进行性能测试。 - ICR
22
ToArray()是LINQ中的扩展方法,因此您需要添加using System.Linq; - Christian Davén

17

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

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

当然,如果你特别想要它在一个数组中;

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

7

Values 上有一个 ToArray() 函数:

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

但我认为这不是很有效率的(虽然我没有真正尝试过,但我猜它会将所有这些值复制到数组中)。你真的需要一个数组吗?如果不需要,我建议尝试传递IEnumerable:

IEnumerable<Foo> foos = dict.Values;

6

如果你想使用linq,可以尝试以下方法:

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

我不知道哪个更快或更好。两者对我都可以使用。


4
dict.Values.ToArray() 的作用与使用委托逐个生成值的方法相同,但它避免了每个值都需要生成委托所带来的额外开销。 - Lance U. Matthews

3
这些天,一旦您使用LINQ,就可以将字典的键和值转换为单个字符串。
您可以使用以下代码:
```csharp string result = string.Join(",", yourDictionary.Select(x => x.Key + ":" + x.Value)); ```
// 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接