2016-10-14 33 views
1

我是使用lambda表示法的新手,所以如果我錯了,請糾正我的理解。是否有可能使用lambda在一個語句中重寫每個循環的a?我有以下幾點:將foreach轉換爲C中的lambda表達式

型號

public partial class Section 
{ 
    public int SectionID { get; set; } 
    public List<Question> questions { get; set; } 
    //... 
} 

public partial class Question 
{ 
    public int QuestionID { get; set; } 
    public int SectionID { get; set; } 
    //... 
} 

的foreach

List<Section> sections = db.getSections.ToList(); 
List<Question> questions = db.getQuestions.ToList(); 

foreach (var section in sections) 
{ 
    List<Question> questionsInSection = new List<Question>(); 
    foreach (var question in questions) 
    { 
     if(section.SectionID == question.SectionID) 
      questionsInSection.Add(question); 
    } 
    section.Questions = questionsInSection; 
} 
+2

你嘗試過什麼嗎?請展示您的嘗試 –

+1

如果您在問題中加入了您正在嘗試做的事情,這也會有所幫助。包括示例輸入和預期輸出。 –

+1

你還使用EF嗎?如果是這樣,請顯示您的模型類 –

回答

-1

以前有人發佈了被刪除的答案......這個解決方案完成了我在單個語句中所要做的。

sections.ForEach(s => { s.Questions = questions.Where(q => q.SectionID == s.SectionID).ToList(); }); 
+0

這是我自己的帖子,爲什麼要投票?這正是我想要完成的。 – usr4896260

+0

Did'nt downvote。既然這不能解決你的問題,但更多關於你所嘗試的細節,那麼這應該被編輯爲上面的問題,而不是作爲答案發布。 –

1

如果導航屬性是不是一種選擇,你不希望創建的每個章節的新實例,並複製它的屬性一個一,你仍然可以使用LINQ替換內部的foreach,並保留原來的外部foreach:

List<Section> sections = db.getSections.ToList(); 
List<Question> questions = db.getQuestions.ToList(); 
foreach (var section in sections) 
{ 
    section.Questions = questions.Where(o => o.SectionID == section.SectionID).ToList(); 
} 
+1

擊敗我吧:) –

1
List<Section> sections = questions 
         .GroupBy(x=>x.SectionID) 
         .Select(x=>new Section(){SectionID=x.Key,questions=x.ToList()}) 
         .ToList() 
+2

這不會有'部門' –

1

我認爲你正在使用實體框架,如果是設置Navigation Properties,只是:

var sections = db.getSections.Include(s => s.Questions) 
          .ToList(); 

如果這是一個一對多的關係檢查:Configure One-to-Many Relationship

如果你是不使用實體框架然後GroupJoin兩個表和項目新Section

var result = (from section in db.getSections 
       join question in db.getQuestion 
       on section.SectionID == questions.SectionID into sectionQuestions 
       select new Section 
       { 
        Prop1 = section.Prop1, 
        Prop2 = section.prop2, 
        Questions = sectionQuestions 
       }); 

如果由於某種原因你不希望使用導航屬性,也沒有項目的新Section,你的數據是大,YPU想使用foreach那麼做這種方式:

var sections = db.getSections.ToList(); 
var questions = db.getQuestions.GroupBy(item => item.SectionID) 
           .ToDictionary(key => key.Key, 
              value => value.Select(i => i).ToList()); 

foreach (var section in sections) 
{ 
    List<Question> selectedQuestions; 
    if (efficientQuestions.TryGetValue(section.SectionID, out selectedQuestions)) 
    { 
     section.Questions = selectedQuestions; 
    } 
} 

的我使這個foreach更復雜的原因是,所以問題存儲在一個字典中,其中密鑰是SectionID。這樣的複雜度是o(n)而不是o(n)2

但同樣(使用foreach + Where時)..當你通過所有if在說明中看到...毫無疑問,最好的選擇就是使用的導航性能

+1

@ usr4896260的所有其他屬性 - 這有助於你解決問題嗎? –