Преобразование словаря в список (C #)

#c# #list #dictionary

#c# #Список #словарь

Вопрос:

На самом деле это не проблема, но мне любопытно, есть ли более приятный способ сделать это. В принципе, у меня есть словарь, где ключом является созданная мной структура. Что мне нужно сделать, так это получить список определенного свойства в ключах. Т.е. в структуре у меня есть поле с именем ‘ID’, список которого я хочу получить. Что я сейчас делаю, так это:

 List<long> keys = new List<long>();
foreach(var key in dict.Keys)
{
     keys.Add(key.ID);
}
  

Это работает, но мне просто интересно, не упускаю ли я еще более простой способ — сначала я подумал, что, возможно, методу ToList можно задать параметр, чтобы я мог указать, какую часть структуры я хочу в списке, но, похоже, я не могу.

Как бы вы, ребята, улучшили это?

Комментарии:

1. вы пробовали LINQ. Метод ToList()?

2. Извините, я это пропустил. Однако ниже приведены некоторые хорошие ответы! ^^

Ответ №1:

Вы можете использовать LINQ:

 List<long> keys = dict.Keys.Select(k => k.ID).ToList();
  

Здесь вы передаете идентификатор в Select() , а не ToList() , и вызываете только ToList() для преобразования результирующей коллекции в список.

Комментарии:

1. 1 @OP: К вашему сведению, вам не нужен ToList, если вы можете обойтись без IEnumerable<long> , т. Е. Если вы просто перебираете его.

Ответ №2:

Использование Select (из Linq) для проектирования и ToArray создания конкретного списка. (Или ToList , если вам нужно изменить результирующую коллекцию позже)

 var keys = dict.Keys.Select(k => k.ID).ToArray();
  

Комментарии:

1. Чтобы быть педантичным, ToArray() создает long[] массив, а не List<long> .

2. Да, я предлагал фактически изменить результирующий тип: D List<T> имеет небольшие накладные расходы по сравнению с T[] , и когда нет причин использовать функциональность, мне кажется излишним создавать экземпляр ни для чего (поскольку резервное хранилище T[] в любом случае является внутренним).

Ответ №3:

Использование Linq:

 var keys = dict.Keys.Select(p => p.ID).ToList();
  

Используя один из конструкторов List

 var keys = new List<long>(dict.Keys.Select(p => p.ID));
  

(конструктор принимает an IEnumerable<T> , и Select on dict.Keys явно является им)

и использование AddRange

 var keys = new List<long>();
keys.AddRange(dict.Keys.Select(p => p.ID));
  

В общем случае мы используем .Select «of» Linq для решения проблемы. Очевидно, что мы могли бы написать:

 from p in dict.Keys select p.ID 
  

вместо

 dict.Keys.Select(p => p.ID)
  

Я отмечу, что единственное интересное отличие заключается в том AddRange , что другие «способы» создают новый List и заполняют его. AddRange добавляет к уже существующему List , в котором уже могут быть элементы.

Комментарии:

1. За исключением того, что ключи не являются длинными.

2. @BoltClock исправил все примеры

Ответ №4:

используйте linq для возврата идентификаторов в виде списка:

 List<long> result = dic.Select(x => x.Key.ID).ToList();