Как я могу получить список субэлементов из субдиректории? - PullRequest
4 голосов
/ 31 мая 2019

Я хочу получить список подэлементов из поддиректория

У меня есть это:

Dictionary<string, Dictionary<string, List<InstanceLog>>> dic;

И я хочу что-то вроде этого (Получить все списки InstanceLog-списков из поддиктинария в одномбольшой список.):

List<InstanceLog> logList = GetValues(dic);

Я пробовал что-то подобное, но оно не работает:

List<InstanceLog> logList = GetFetchtedList()
  .Select(x => x.Value.ToList())
  .Cast<InstanceLog>()
  .ToList()

Большое спасибо за помощь!

Ответы [ 3 ]

3 голосов
/ 31 мая 2019

Вы должны сгладить dic дважды :

Dictionary<string, Dictionary<string, List<InstanceLog>>> dic = ...;

List<InstanceLog> logList = dic
  .SelectMany(pair => pair.Value) // Inner Dictionaries
  .SelectMany(pair => pair.Value) // Inner Lists
  .ToList();                      // Materialized as one big list
2 голосов
/ 31 мая 2019

На техническом языке вы хотите сгладить списки, которые хранятся в значениях словаря, поэтому вам нужно SelectMany:

var values = dic.Values
                 .SelectMany(val => val.Values)
                 .SelectMany(val => val);

где values будет сбором ваших данных типа IEnumerable<InstanceLog>, что именно то, что вы хотите.

0 голосов
/ 31 мая 2019

SelectMany - это ключевое слово.То, что он делает, это группирует как один список, если выборка является некоторой коллекцией.Если вам нравится, возвращайте, как если бы вы сделали Union.

Dictionary<string, Dictionary<string, List<InstanceLog>>> dic;

var instanceLogs = dic.SelectMany(d => d.Value.Select(subd => subd.Value)).ToList();

SelectMany на dic, скажем linq:

"Эй, у меня будет результат сбора в этих скобкахпоэтому сгруппируйте их как 1 коллекцию "

Select в дополнительном словаре просто возвращает коллекцию 1 для SelectMany для захвата и обработки.

Это повторяет только коллекцию один раз и не использует никаких дополнительных операций, которые не нужны (linq wise)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...