Как получить нижележащие элементы каждого элемента в каждом цикле, используя c #?

#c# #.net #list #foreach #iterator

#c# #.net #Список #foreach #итератор

Вопрос:

Я не уверен, как именно задать этот вопрос, но это проблема:

Я получил список, который я фильтрую по SubTypeId (ключ = 1 или ключ = 2), который выглядит следующим образом:

введите описание изображения здесь

Как вы можете видеть, «Key = 1» содержит 4 объекта внутри: 0, 1, 2 и 3. Все эти объекты имеют одинаковое описание типа. Как я могу получить этот элемент «TypeDescription» один раз в этом для каждого цикла?

Заранее спасибо!:)

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

1. Что ж. item это коллекция. Вам нужно проиндексировать коллекцию. Ваш первый объект имеет индекс 0, следующий — 1 и т.д. и т.п.

2. результат a GroupBy сам по себе является перечислимым (содержит все элементы в группе). Таким образом, вы можете выполнять цикл над ними. foreach (var subitem in item) { ... } .

3. используйте .ToArray() для преобразования его в индексированную коллекцию

4. элемент. FirstOrDefault().Описание типа

Ответ №1:

Здесь у вас есть несколько вариантов:

  1. Сгруппируйте свой массив элементов по двум параметрам:
 var res = Reports.GroupBy(u => new {u.SubTypeId, u.TypeDescription})
                     .Select(r => new
                      {
                         r.Key, // Key here consists of two elements
                         items = r.Select(i => new
                         {
                             i.DocumentPath,
                             i.Id,
                             i.Name,
                             i.SubTypeDescription,
                             i.TypeId
                         })
                      }).ToList();
  

В этом случае в результате у вас будет коллекция сгруппированных элементов SubtypeId and TypeDescription , содержащая коллекцию всех других необходимых вам элементов.

  1. Создайте вложенную группировку:
 var res2 = Reports.GroupBy(u => u.SubTypeId)
                          .Select(r => r.ToList()
                                        .GroupBy(r => r.TypeDescription)
                                        .Select(item=> new {
                                             item.Key,
                                             items = item.Select(i => new 
                                             {
                                                  i.DocumentPath,
                                                  i.Id,
                                                  i.Name,
                                                  i.SubTypeDescription,
                                                  i.TypeId
                                             })
                                         })).ToList();
  

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


Несколько советов:

  1. Пожалуйста, постарайтесь избегать манипуляций с массивами внутри объекта цикла, как в приведенном выше случае, вы выполнили группировку массивов в foreach разделе ввода коллекций. Вместо этого назначьте манипуляции с массивом отдельной переменной перед циклом.
  2. Вместо анонимных объектов попробуйте использовать реальные class модели.
    Примечание: в приведенных выше примерах я использовал анонимный объект только для демонстрационных целей.