【问题标题】:GroupBy LINQ statementGroupBy LINQ 语句
【发布时间】:2013-05-24 13:13:36
【问题描述】:

我有一个按主题和家长分组的问题列表。

例如我会有

Subject 1
Parent 1
Question 1

Subject2
Parent2
Question2

Subject1
Parent2
Question3

Subject2
Parent2
Question4

现在我希望显示某种树状视图,例如

Subject 1
    Parent 1
       Question 1
    Parent 2
       Question 2
       Question 3

Subject 2
    Parent 1
       Question 4
    Parent 2
       Question 5
       Question 6

如何使用 GroupBy LINQ 语句实现这一目标?

我尝试了一些还不能正常工作的东西

            var questionSubjectGrps = questionsBll.GetReportQuestions()
            .Where(x => x.VersionId == iLatestVersion)
            .OrderByDescending(x => x.SubjectId)
            .GroupBy(subject => new { subject.ReportQuestionTitle, subject.ParentId });

任何帮助将不胜感激

谢谢

**********************新代码****************

            IEnumerable<ReportQuestion> questionSubjectGrps = questionsBll.GetReportQuestions().Where(x => x.VersionId == iLatestVersion);

        var tree = questionSubjectGrps.Select(questSubGrps => questSubGrps.SubjectId)
                  .Distinct()
                  .Select(q => new
                  {
                      Subject = q.SubjectId,
                      Parents = questionSubjectGrps
                                  .Where(q2 => q2.SubjectId == q.SubjectId)
                                  .Select(q2 => new
                                  {
                                      Parent = q2.ParentId,
                                      Question = questionSubjectGrps
                                          .Where(q3 => q3.SubjectId == q.SubjectId && q3.ParentId == q2.ParentId)
                                          .Select(q3 => q3.QuestionId)
                                  })

                  });

【问题讨论】:

  • 请您把您的问题格式化好一点?我猜你通过编辑器失去了一些意义!
  • @KingCronus 谢谢我做了:)
  • 那么您的编辑现在有效吗?您的新代码有什么问题?

标签: c# linq group-by


【解决方案1】:

您可以使用几个级别的GroupBy 来执行此操作,如下所示。

此输入与您提供的预期输出匹配,而不是您提供的输入。

var questions = new List<Question>
    {
        new Question { SubjectId = 1, ParentId = 1, QuestionId = 1 },
        new Question { SubjectId = 1, ParentId = 2, QuestionId = 3 },
        new Question { SubjectId = 2, ParentId = 2, QuestionId = 2 },
        new Question { SubjectId = 2, ParentId = 2, QuestionId = 3 },
        new Question { SubjectId = 2, ParentId = 1, QuestionId = 4 },
        new Question { SubjectId = 2, ParentId = 2, QuestionId = 5 },
        new Question { SubjectId = 2, ParentId = 2, QuestionId = 6 },
    };

第一个 GroupBy 按主题 ID 分组。第二个 GroupBy 按父 ID 对每个主题组进行分组。

var grouped = questions.GroupBy(
    q => q.SubjectId,
    (sid, qs) => new { SubjectId = sid, Groups = qs.GroupBy(q => q.ParentId) });

对于两个级别的GroupBy,您需要三个foreach 循环来获取所有问题。

foreach (var subjectGroup in grouped)
{
    Console.WriteLine("Subject {0}", subjectGroup.SubjectId);
    foreach (var parentGroup in subjectGroup.Groups)
    {
        Console.WriteLine("\tParent {0}", parentGroup.Key);
        foreach (var question in parentGroup)
        {
            Console.WriteLine("\t\tQuestion {0}", question.QuestionId);
        }
    }
}

【讨论】:

    【解决方案2】:

    我不认为 GroupBy 实际上是你想要的 - 我认为你想要一个层次结构。例如:

      var questionSubjectGrps = questionsBll
                .GetReportQuestions()
                .Tolist();
    
      var tree = questionSubjectGrps.Select(questionSubjectGrps => q.SubjectId)
                .Distinct()
                .Select(q => new 
                {
                    Subject = q.SubjectId,
                    Parents = questionSubjectGrps
                                .Where(q2 => q2.SubjectId == q.SubjectId)
                                .Select(q2 => new 
                                {
                                    Parent = q2.ParentId,
                                    Question = questionSubjectGrps
                                        .Where(q3 => q3.SubjectId == q.SubjectId && q3.ParentId == q2.ParentId)
                                        .Select(q3 => q3.QuestionId)
                                })
    
                });
    

    【讨论】:

    • 嗨,戴夫,我接受了您的建议,请参阅已编辑的问题。但是我收到以下错误:- .Select(q => new 未被接受,Subject = q.SubjectId, q.SubjectId 不存在,并且循环中的第二个 Select 出现相同的错误
    • 这正是GroupBy 会做的事情,只是效率要低得多。
    • @Rawling GroupBy 只会创建一个维度,不是吗?
    • @Rawling 你能举个例子说明你将如何使用 GroupBy 来做这件事吗?
    • @Johann 我已经添加了一个答案,而不是继续尝试在 cmets 中解决这个问题 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2019-01-10
    相关资源
    最近更新 更多