как избежать возможного предупреждения о множественном перечислении

#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. Спасибо и признателен за ваш ответ и объяснение.