2016-10-14 1 views
1

Ich bin neu in der Verwendung von Lambda-Notation, also bitte korrigieren Sie mein Verständnis, wenn ich falsch liege. Ist es möglich, das a für jede Schleife in einer Anweisung mit Lambda neu zu schreiben? Ich mit dem folgende:konvertieren foreach zu Lambda-Ausdruck in C#

Modell

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

Haben Sie irgendwas versucht? Bitte zeigen Sie Ihre Versuche –

+1

Es würde auch helfen, wenn Sie zu Ihrer Frage hinzugefügt, was Sie versuchen, zu tun. Einschließlich einer Beispieleingabe und einer erwarteten Ausgabe. –

+1

Auch verwenden Sie EF? Wenn ja, zeigen Sie bitte Ihre Modellklassen –

Antwort

-1

Es gab eine vorherige Antwort, die jemand gepostet hat, die gelöscht wurde ... Diese Lösungen erreichen, was ich in einer einzigen Aussage versuchte.

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

Das ist mein eigener Beitrag, warum die down vote? Das habe ich versucht zu erreichen. – usr4896260

+0

Did'nt Downvote. Da dies Ihre Frage nicht löst, sondern mehr Details zu dem, was Sie ausprobiert haben, sollte dies zu der obigen Frage editiert und nicht als Antwort gepostet werden. –

1

Wenn Navigationseigenschaften keine Option sind, und Sie wollen nicht neue Instanz von jedem Abschnitt erstellen und kopieren es ist eine Eigenschaft von Eine, Sie können immer noch die innere foreach mit LINQ ersetzen und verlassen Sie die externe foreach wie es ist:

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

Beat mich dazu :) –

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

Dies wird nicht alle anderen Eigenschaften von 'Section' haben –

1

Ich glaube, Sie Entity Framework verwenden, und wenn dies der Fall stellen Sie den Navigation Properties und einfach:

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

Wenn dies eine Beziehung Check Eins-zu-viele ist: Configure One-to-Many Relationship

Wenn Sie Verwenden Sie nicht Entity Framework dann GroupJoin die zwei Tabellen und projizieren eine neue Section:


Wenn aus irgendeinem Grund Sie nicht über die Navigationseigenschaften verwenden möchten, noch eine neue Section projizieren, ist Ihre Daten groß und ypu wollen es die foreach verwenden, dann tun auf diese Weise:

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; 
    } 
} 

Die Grund, warum ich diese foreach komplexer gemacht habe, ist so, dass die Fragen in einem Wörterbuch gespeichert werden, wo der Schlüssel der SectionID ist. Auf diese Weise ist die Komplexität von o(n) und nicht o(n)2 (wie bei foreach + Where mit)

Aber auch hier .. wie Sie von allen if in der Erklärung sehen .. Die beste Option ist ohne Zweifel nur Navigationseigenschaften verwenden

+1

@ usr4896260 - Hat dies Ihnen geholfen, das Problem zu lösen? –