辞書の値を配列に変換する


81

辞書の値のリストを配列に変換する最も効率的な方法は何ですか?

たとえば、Dictionarywhere KeyisStringValueisがあるFoo場合、取得したいFoo[]

VS 2005、C#2.0を使用しています

回答:


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>()のパフォーマンスは向上しますか?
ゴラン

しかし、それが最も効率的であることをどうやって知ることができますか?
トムカーター

2
@Tom私は通常、フレームワークに組み込まれているもの(.CopyTo()や.ToArray()など)が最も効率的な方法であると考えています。Microsoftiesは私より賢いです。:)
マットハミルトン

5
ToArrayはCopyToよりもパフォーマンスが低くなります(CopyToを使用して内部中間表現にコピーしてから、もう一度コピーして返します)。ただし、すべてのマイクロパフォーマンス関連の問題と同様に、読みやすさ、堅牢性、保守性を重視し、問題がある場合はパフォーマンスを測定します。
ICR

16
あなたが追加する必要があるのでてToArray()は、LINQでの拡張メソッドであるusing System.Linq;
クリスチャンDavén

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()同じことを行いますが、デリゲートを介して各値を具体化するオーバーヘッドはありません。
ベーコン2013

1

最近では、LINQを使用できるようになると、辞書キーとその値を1つの文字列に変換できます。

次のコードを使用できます。

// 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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.