#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:
Здесь у вас есть несколько вариантов:
- Сгруппируйте свой массив элементов по двум параметрам:
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
, содержащая коллекцию всех других необходимых вам элементов.
- Создайте вложенную группировку:
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();
В этом случае у вас будет немного больше вложений, но выходные данные, вероятно, будут более близки к тому, что вы изначально запрашивали.
Несколько советов:
- Пожалуйста, постарайтесь избегать манипуляций с массивами внутри объекта цикла, как в приведенном выше случае, вы выполнили группировку массивов в
foreach
разделе ввода коллекций. Вместо этого назначьте манипуляции с массивом отдельной переменной перед циклом. - Вместо анонимных объектов попробуйте использовать реальные
class
модели.
Примечание: в приведенных выше примерах я использовал анонимный объект только для демонстрационных целей.