#c#
#c#
Вопрос:
Для приведенного ниже фрагмента кода я получаю предупреждение possible multiple enumeration
о Count
том, что я делаю g.ToList()
и что Students
я делаю g.Select
, двукратное перечисление для групповых элементов.
Как этого избежать?
var redefineSchoolDatas = group.Select(g => new RedefineSchoolData
{
ClassName = g.Key,
Count = g.ToList().Count,
Students = g.Select(s => new Student
{
StudentName = s.StudentName,
StudentAge = s.StudentAge
}).ToList(),
}).ToList();
Комментарии:
1. добавьте, что такое группа, не
Count = g.ToList().Count,
совпадает сCount = g.Count()
, нужен ли tolist для студентов?
Ответ №1:
Один из возможных способов избежать перечисления IEnumerable
дважды:
var redefineSchoolDatas = group.Select(g =>
{
var elementsInGroup = g.ToList();
return new RedefineSchoolData
{
ClassName = g.Key,
Count = elementsInGroup.Count,
Students = elementsInGroup.Select(s => new Student
{
StudentName = s.StudentName,
StudentAge = s.StudentAge
}).ToList(),
}
}).ToList();
Тем не менее, я бы посоветовал вам воздержаться от наличия Count
свойства в вашем RedefineSchoolData
классе. Сохранение Count
отдельного от collection ( Students
) не очень хорошая идея: представьте, что вы удаляете ученика — тогда вам также нужно не забыть обновить Count
. Вместо этого вы могли бы создать свой класс следующим образом:
class RedefineSchoolData
{
public Student Students { get; set; }
public int Count => Students.Count;
// Other properties kept out for brevity
}
// Now your LINQ statements could be:
var redefineSchoolDatas = group.Select(g =>
new RedefineSchoolData
{
ClassName = g.Key,
Students = g.Select(s => new Student
{
StudentName = s.StudentName,
StudentAge = s.StudentAge
}).ToList(),
}).ToList();
Комментарии:
1. Спасибо и признателен за ваш ответ и объяснение.