亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C# 中的 Linq 多組加入

C# 中的 Linq 多組加入

C#
波斯汪 2023-07-23 14:18:23
我需要創建如下所示的結構。第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 在這種情況下不存在。我該如何解決這個問題。
查看完整描述

3 回答

?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

您的請求與您的對象不匹配,您是否希望在所有部分中都有一個結合 Message 和 Question 的唯一列表?


或者,如果您想要像“Section => Questions => Messages”這樣的樹,您可以這樣做:


var group1 = SectionList.Select(section => new Section

{

    SectionID = section.SectionID,

    SectionName = section.SectionName,

    Questions = QuestionList.Where(question => question.SectionID.Equals(section.SectionID))

        .Select(question => new Question

        {

            QuestionID = question.QuestionID,

            QuestionName = question.QuestionName,

            SectionID = section.SectionID,

            Messages = MessagesList.Where(message => message.QuestionID.Equals(question.QuestionID))

                .Select(message => new Messages

                {

                    MessagesID = message.MessagesID,

                    MessagesName = message.MessagesName,

                    QuestionID = message.QuestionID

                })

        })

});

當然,你需要稍微改變一下你的類:


public class Question

{


    public int QuestionID { get; set; }

    public string QuestionName { get; set; }

    public int SectionID { get; set; }

    public IEnumerable<Messages> Messages { get; set; }

}


public class Section

{


    public int SectionID { get; set; }

    public string SectionName { get; set; }

    public IEnumerable<Question> Questions { get; set; }

}


查看完整回答
反對 回復 2023-07-23
?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

您可以加入QuestionListinto MessagesList。QuestionMessagesList之后,您需要QuestionMessagesList加入SectionList。


var questionMessages = QuestionList.GroupJoin(MessagesList,

                q => q.QuestionID,

                m => m.QuestionID,


                (Question, Messages) => new { Question, Messages }

            );


var groupJoin = SectionList.GroupJoin(questionMessages,

                sct => sct.SectionID,

                s => s.Question.SectionID,


                (sct, QuestionsGroup) => new

                {

                    Questions = QuestionsGroup,

                    SectionName = sct.SectionName

                });

然后:


            foreach (var item in groupJoin)

            {

                Console.WriteLine(item.SectionName);


                foreach (var stud in item.Questions)

                {

                    Console.WriteLine($" - {stud.Question.QuestionName}");


                    foreach (var message in stud.Messages)

                    {

                        Console.WriteLine($"  -- {message.MessagesName}");

                    }

                }

            }

http://img1.sycdn.imooc.com//64bcc69e00013a6902240330.jpg

查看完整回答
反對 回復 2023-07-23
?
繁星淼淼

TA貢獻1775條經驗 獲得超11個贊

您的創建結構應該改變,但如果您想要一個保留大部分創建結構的解決方案,您可以使用這個


但請注意,在每個問題和每個部分中使用 where 并不利于性能。您應該在創建部分列表時創建消息列表和問題列表。


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}

};


// Question collection

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

  new Question() { QuestionID = 1, QuestionName = "q1", SectionID = 1,messages = MessagesList.Where(message=> message.QuestionID==1).ToList() } ,

  new Question() { QuestionID = 2, QuestionName = "q2",   SectionID = 1,messages = MessagesList.Where(message=> message.QuestionID==2).ToList() } ,

  new Question() { QuestionID = 3, QuestionName = "q3",  SectionID = 2,messages = MessagesList.Where(message=> message.QuestionID==3).ToList() } ,

  new Question() { QuestionID = 4, QuestionName = "q4" ,  SectionID = 2 ,messages = MessagesList.Where(message=> message.QuestionID==4).ToList()} ,

  new Question() { QuestionID = 5, QuestionName = "q5" ,  SectionID = 2 ,messages = MessagesList.Where(message=> message.QuestionID==5).ToList() }

};  


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

  new Section(){ SectionID = 1, SectionName="Section 1",questions = QuestionList.Where(question=> question.SectionID == 1).ToList()},

  new Section(){ SectionID = 2, SectionName="Section 2",questions = QuestionList.Where(question=> question.SectionID == 2).ToList()},

  new Section(){ SectionID = 3, SectionName="Section 3",questions = QuestionList.Where(question=> question.SectionID == 3).ToList()}

};


foreach (var section in SectionList)

{

  Console.WriteLine("Section: " + section.SectionName);

  foreach (var question in section.questions)

  {

     Console.WriteLine("\tQuestion: " + question.QuestionName);

     foreach (var message in question.messages)

     {

        Console.WriteLine("\t\tMessage: " + message.MessagesName);

     }

  }

}

為此,您必須稍微更改您的課程。


public class Question

{


    public int QuestionID { get; set; }

    public string QuestionName { get; set; }

    public int SectionID { get; set; }


    public List<Messages> messages { get; set; }

}

public class Messages

{


    public int MessagesID { get; set; }

    public string MessagesName { get; set; }

    public int QuestionID { get; set; }

}

public class Section

{


    public int SectionID { get; set; }

    public string SectionName { get; set; }


    public List<Question> questions { get; set; }

}


查看完整回答
反對 回復 2023-07-23
  • 3 回答
  • 0 關注
  • 230 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號