Sözlük değerlerini diziye dönüştür


82

Bir sözlüğün değerler listesini bir diziye dönüştürmenin en etkili yolu nedir?

Bir varsa Örneğin, Dictionarynerede Keyolduğunu Stringve Valueolup Foo, Almak istediğimFoo[]

VS 2005, C # 2.0 kullanıyorum

Yanıtlar:


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> () uzantısı daha iyi performans gösteriyor mu?
Goran

ama bunun en verimli olduğunu nasıl bileceğiz?
Tom Carter

2
@Tom Genelde çerçevede yerleşik olan herhangi bir şeyin (.CopyTo () veya .ToArray () gibi) bunu yapmanın en verimli yolu olduğu görüşünü alırım. Microsoft'lar benden daha akıllı. :)
Matt Hamilton

5
ToArray, CopyTo'dan daha az performanslıdır (dahili bir ara gösterime kopyalamak için CopyTo'yu kullanır ve sonra geri döndürmek için tekrar Kopyala'yı kullanır). Bununla birlikte, mikro performansla ilgili tüm konularda olduğu gibi, okunabilirlik, sağlamlık ve sürdürülebilirlik için gidin ve bir sorun varsa performansı ölçün.
ICR

16
ToArray (), LINQ'daki bir genişletme yöntemidir, bu yüzden eklemeniz gerekirusing System.Linq;
Christian Davén

12

Bir listede saklayın. Daha kolay;

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

Elbette özellikle bir dizi halinde istiyorsanız;

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

6

Değerler üzerinde ToArray () işlevi vardır:

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

Ama verimli olduğunu düşünmüyorum (gerçekten denemedim, ama sanırım tüm bu değerleri diziye kopyalıyor). Gerçekten bir Diziye ihtiyacınız var mı? Değilse, IEnumerable'ı geçmeye çalışırdım:

IEnumerable<Foo> foos = dict.Values;

4

Linq'i kullanmak istiyorsanız, aşağıdakileri deneyebilirsiniz:

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

Hangisinin daha hızlı veya daha iyi olduğunu bilmiyorum. İkisi de benim için çalışıyor.


2
dict.Values.ToArray()aynı şeyi yapar, ancak her bir değeri bir temsilci aracılığıyla gerçekleştirme yükü olmadan.
Lance U. Matthews

1

Bu günlerde, LINQ'ya sahip olduğunuzda, sözlük anahtarlarını ve değerlerini tek bir dizeye dönüştürebilirsiniz.

Aşağıdaki kodu kullanabilirsiniz:

// 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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.