C# 中的 Linq 多组加入

我需要创建如下所示的结构。

  • 第1节

    • 问题1

    • 消息1

  • 第2节

    • 问题2

    • 消息1

    • 消息2

我编写了下面的代码来生成它。

using System;

using System.Linq;

using System.Collections.Generic;



public class Program

{

    public static void Main()

    {

        // Question collection

        IList<Question> QuestionList = new List<Question>() { 

                new Question() { QuestionID = 1, QuestionName = "q1", SectionID = 1 } ,

                new Question() { QuestionID = 2, QuestionName = "q2",   SectionID = 1 } ,

                new Question() { QuestionID = 3, QuestionName = "q3",  SectionID = 2 } ,

                new Question() { QuestionID = 4, QuestionName = "q4" ,  SectionID = 2 } ,

                new Question() { QuestionID = 5, QuestionName = "q5"  } 

            };


        IList<Section> SectionList = new List<Section>() { 

                new Section(){ SectionID = 1, SectionName="Section 1"},

                new Section(){ SectionID = 2, SectionName="Section 2"},

                new Section(){ SectionID = 3, SectionName="Section 3"}

            };

        IList<Messages> MessagesList = new List<Messages>() { 

                new Messages(){ MessagesID = 1, MessagesName="Message 1",QuestionID=1},

                new Messages(){ MessagesID = 2, MessagesName="Message 2",QuestionID=1},

                new Messages(){ MessagesID = 3, MessagesName="Message 3",QuestionID=2}

            };

        var groupJoin = SectionList.GroupJoin(QuestionList,  //inner sequence

                                sct => sct.SectionID, //outerKeySelector 

                                s => s.SectionID,     //innerKeySelector


                                (sct, QuestionsGroup) => new // resultSelector 

                                {

                                    Questions = QuestionsGroup,


                                    SectionName = sct.SectionName

                                });

不幸的是,我找不到加入这两个小组的方法。因为部分和问题使用sectionid连接,而问题和消息使用questionid连接。当我使用第二组加入时,我收到错误 Questionid 在这种情况下不存在。我该如何解决这个问题。


波斯汪
浏览 188回答 3
3回答

拉风的咖菲猫

您的请求与您的对象不匹配,您是否希望在所有部分中都有一个结合 Message 和 Question 的唯一列表?或者,如果您想要像“Section => Questions => Messages”这样的树,您可以这样做:var group1 = SectionList.Select(section => new Section{&nbsp; &nbsp; SectionID = section.SectionID,&nbsp; &nbsp; SectionName = section.SectionName,&nbsp; &nbsp; Questions = QuestionList.Where(question => question.SectionID.Equals(section.SectionID))&nbsp; &nbsp; &nbsp; &nbsp; .Select(question => new Question&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; QuestionID = question.QuestionID,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; QuestionName = question.QuestionName,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SectionID = section.SectionID,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Messages = MessagesList.Where(message => message.QuestionID.Equals(question.QuestionID))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .Select(message => new Messages&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MessagesID = message.MessagesID,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MessagesName = message.MessagesName,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; QuestionID = message.QuestionID&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; &nbsp; })});当然,你需要稍微改变一下你的类:public class Question{&nbsp; &nbsp; public int QuestionID { get; set; }&nbsp; &nbsp; public string QuestionName { get; set; }&nbsp; &nbsp; public int SectionID { get; set; }&nbsp; &nbsp; public IEnumerable<Messages> Messages { get; set; }}public class Section{&nbsp; &nbsp; public int SectionID { get; set; }&nbsp; &nbsp; public string SectionName { get; set; }&nbsp; &nbsp; public IEnumerable<Question> Questions { get; set; }}

慕码人8056858

您可以加入QuestionListinto MessagesList。QuestionMessagesList之后,您需要QuestionMessagesList加入SectionList。var questionMessages = QuestionList.GroupJoin(MessagesList,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; q => q.QuestionID,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m => m.QuestionID,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (Question, Messages) => new { Question, Messages }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );var groupJoin = SectionList.GroupJoin(questionMessages,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sct => sct.SectionID,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s => s.Question.SectionID,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (sct, QuestionsGroup) => new&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Questions = QuestionsGroup,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SectionName = sct.SectionName&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });然后:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (var item in groupJoin)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(item.SectionName);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (var stud in item.Questions)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine($" - {stud.Question.QuestionName}");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (var message in stud.Messages)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine($"&nbsp; -- {message.MessagesName}");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }

繁星淼淼

您的创建结构应该改变,但如果您想要一个保留大部分创建结构的解决方案,您可以使用这个但请注意,在每个问题和每个部分中使用 where 并不利于性能。您应该在创建部分列表时创建消息列表和问题列表。IList<Messages> MessagesList = new List<Messages>() {&nbsp; new Messages(){ MessagesID = 1, MessagesName="Message 1",QuestionID=1},&nbsp; new Messages(){ MessagesID = 2, MessagesName="Message 2",QuestionID=1},&nbsp; new Messages(){ MessagesID = 3, MessagesName="Message 3",QuestionID=2}};// Question collectionIList<Question> QuestionList = new List<Question>() {&nbsp; new Question() { QuestionID = 1, QuestionName = "q1", SectionID = 1,messages = MessagesList.Where(message=> message.QuestionID==1).ToList() } ,&nbsp; new Question() { QuestionID = 2, QuestionName = "q2",&nbsp; &nbsp;SectionID = 1,messages = MessagesList.Where(message=> message.QuestionID==2).ToList() } ,&nbsp; new Question() { QuestionID = 3, QuestionName = "q3",&nbsp; SectionID = 2,messages = MessagesList.Where(message=> message.QuestionID==3).ToList() } ,&nbsp; new Question() { QuestionID = 4, QuestionName = "q4" ,&nbsp; SectionID = 2 ,messages = MessagesList.Where(message=> message.QuestionID==4).ToList()} ,&nbsp; new Question() { QuestionID = 5, QuestionName = "q5" ,&nbsp; SectionID = 2 ,messages = MessagesList.Where(message=> message.QuestionID==5).ToList() }};&nbsp;&nbsp;IList<Section> SectionList = new List<Section>() {&nbsp; new Section(){ SectionID = 1, SectionName="Section 1",questions = QuestionList.Where(question=> question.SectionID == 1).ToList()},&nbsp; new Section(){ SectionID = 2, SectionName="Section 2",questions = QuestionList.Where(question=> question.SectionID == 2).ToList()},&nbsp; new Section(){ SectionID = 3, SectionName="Section 3",questions = QuestionList.Where(question=> question.SectionID == 3).ToList()}};foreach (var section in SectionList){&nbsp; Console.WriteLine("Section: " + section.SectionName);&nbsp; foreach (var question in section.questions)&nbsp; {&nbsp; &nbsp; &nbsp;Console.WriteLine("\tQuestion: " + question.QuestionName);&nbsp; &nbsp; &nbsp;foreach (var message in question.messages)&nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("\t\tMessage: " + message.MessagesName);&nbsp; &nbsp; &nbsp;}&nbsp; }}为此,您必须稍微更改您的课程。public class Question{&nbsp; &nbsp; public int QuestionID { get; set; }&nbsp; &nbsp; public string QuestionName { get; set; }&nbsp; &nbsp; public int SectionID { get; set; }&nbsp; &nbsp; public List<Messages> messages { get; set; }}public class Messages{&nbsp; &nbsp; public int MessagesID { get; set; }&nbsp; &nbsp; public string MessagesName { get; set; }&nbsp; &nbsp; public int QuestionID { get; set; }}public class Section{&nbsp; &nbsp; public int SectionID { get; set; }&nbsp; &nbsp; public string SectionName { get; set; }&nbsp; &nbsp; public List<Question> questions { get; set; }}
打开App,查看更多内容
随时随地看视频慕课网APP