Преобразование словарных значений в массив

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 для копирования во внутреннее промежуточное представление, а затем снова Copy, чтобы вернуть его). Однако, как и во всех случаях, связанных с микропроизводительностью, важны удобочитаемость, надежность и ремонтопригодность, а также измерение производительности, если это проблема.
ICR,
16
ToArray () - это метод расширения в LINQ, поэтому вам нужно добавитьusing System.Linq;
Кристиан Давен,
12

Сохраните его в списке. Легче;

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

Конечно, если вам нужен именно массив;

Foo[] arr = (new List<Foo>(dict.Values)).ToArray();
Steztric
источник
6

Для Values ​​есть функция 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);
Лиор Киршнер
источник