Динамически перебирать несколько IEnumerables (Linq Concat?) - PullRequest
0 голосов
/ 09 января 2020

Каков наилучший способ динамической итерации по нескольким IEnumerables одновременно? Списки вложены сложным образом. Это не просто List<List<Entity>>

Пример желаемого поведения:

Dictionary<int, List<Entity>[]> submeshes = new Dictionary<int, List<Entity>[]>();

foreach(Entity e in submeshes.SelectMany(i = 1, i = 4).Select(o => o[0] , o2 => o2[2])).Concat()
{
    e.Update();
}

foreach(Entity e in submeshes.SelectAll().Select(o => o[0])).Concat()
{
    e.Update();
}

Проблема в том, что каждый подэлемент sh состоит из разных списков, и мне нужны два случая.

  1. Мне нужно различение в команде Linq для определенного c смешивания списков.
  2. Мне нужно перебрать все списки.

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Учитывая

var submeshes = new Dictionary<int, List<Entity>[]>();

т.е. у нас есть словарь со значениями массивов списков сущностей, и вы просто хотите извлечь сущности, не зная, например, из какой словарной статьи они пришли, я думаю, вы можете просто используйте два SelectMany ():

submeshes.Values              // = value collection of arrays of lists of entities
         .SelectMany(a => a)  // = enumerable of lists of entities
         .SelectMany(a => a)  // = enumerable of entities

Затем вы можете перебирать полученное перечисление, и оно будет динамически сшивать все списки источников по ходу, т.е. нет копирования или материализации в другие коллекции вдоль способ.

0 голосов
/ 17 января 2020

Я провел тест производительности, и concat + foreach действительно работал плохо. ListCombined будет отдельным списком, который содержит все списки в одном. Самый быстрый способ - это последовательная итерация по спискам list1, list2 и т. Д. c. Таким образом, моим окончательным решением будет метод, который запускает метод generi c для вызова одних и тех же функций из нескольких списков

enter image description here

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