#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();