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

Как наиболее эффективно превратить список значений словаря в массив?

Например, если у меня есть Dictionary, где Key - String, а Value - Foo, я хочу получить Foo[].

Я использую VS 2005, C# 2.0

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
82
0
157 644
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

// 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 13.10.2008 13:15

но как мы узнаем, что он самый эффективный?

Tom Carter 13.10.2008 13:16

Я не понимаю, как ToArray () может быть быстрее, чем прямая копия, которая кажется минималистичной.

Samuel Kim 13.10.2008 13:18

@Tom Я обычно считаю, что все, что встроено в структуру (например, .CopyTo () или .ToArray ()), является наиболее эффективным способом сделать это. Microsofties умнее меня. :)

Matt Hamilton 13.10.2008 13:56

ToArray менее эффективен, чем CopyTo (он использует CopyTo для копирования во внутреннее промежуточное представление, а затем снова Copy, чтобы вернуть его). Однако, как и во всех случаях, связанных с микропроизводительностью, важны удобочитаемость, надежность и ремонтопригодность, а также измеряется производительность, если это проблема.

ICR 13.10.2008 18:01

ToArray () - это метод расширения в LINQ, поэтому вам нужно добавить using System.Linq;

Christian Davén 14.02.2014 17:11

Для Values ​​есть функция ToArray ():

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

Но я не думаю, что это эффективно (я действительно не пробовал, но думаю, он копирует все эти значения в массив). Вам действительно нужен массив? Если нет, я бы попробовал передать IEnumerable:

IEnumerable<Foo> foos = dict.Values;

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

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

Конечно, если вы хотите, чтобы это было именно в массиве;

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

Если вы хотите использовать linq, вы можете попробовать следующее:

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

Я не знаю, какой из них быстрее или лучше. У меня оба работают.

dict.Values.ToArray() делает то же самое, но без накладных расходов на материализацию каждого значения через делегата.

Lance U. Matthews 21.02.2013 17:56

В наши дни, когда у вас есть доступ к 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);

Другие вопросы по теме