объединение группового списка a со списком b и получение среднего значения элементов в списке b

#linq #list #lambda

#linq #Список #лямбда

Вопрос:

У меня есть два списка, список A и список B, их можно объединить по общему свойству (Id), что я пытаюсь сделать, это сгруппировать список A по одному из его свойств (OrgName), присоединив его к списку B. Список B содержит все ответы, данные на набор вопросов. Я хотел бы получить средний балл по каждому вопросу для организации.

Любые предложения будут оценены.

Если это упрощает список A, это список объекта отправки. Где представление имеет такие элементы, как идентификатор, имя, фамилия, компания, электронная почта и т.д., А также содержит ответы участника типа List объекта answer. Объект answer имеет такие элементы, как Id, вопрос, ответ.

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

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

1. не могли бы вы показать, как выглядят ваши классы, и привести пример ввода и вывода?

Ответ №1:

Я создал эти два объекта, чтобы проверить свой ответ.

 public class ObjA
{
    public string OrgName { get; set; }
    public string Name { get; set; }
    public int Id { get; set; }
}

public class ObjB
{
    public int QuestionId { get; set; }
    public int AId { get; set; }
    public int Score { get; set; }
}
  

Следующее выражение linq создает перечисляемый объект, который содержит объект с компанией и перечисляемый список всех вопросов и средние баллы всех участников (свойство Id objA), которые назначены этой компании.

 var result = listA.Join(listB, a => a.Id, b => b.AId, (a, b) =>
    new
    {
        OrgName = a.OrgName,
        QuestionId = b.QuestionId,
        Score = b.Score
    }).GroupBy(g => g.OrgName).Select(r =>
        new
        {
            OrgName = r.Key,
            AverageByQuestion = r.GroupBy(x => x.QuestionId).Select(y => new { QuestionId = y.Key, Score = y.Average(z => z.Score) })
        });