Перетворення значень словника в масив


82

Який найефективніший спосіб перетворення списку значень словника в масив?

Наприклад, якщо у мене є Dictionaryде Keyє Stringі Valueє 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;
Крістіан Давен

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()робить те саме, але без накладних витрат на матеріалізацію кожного значення через делегата.
Lance U. Matthews

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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.