2017-12-27 5 views
0

Ich habe Probleme beim Verständnis der LINQ-Anweisungen. Ich muss folgenden Code:Suchen und Drucken eines Wertes aus 2 verschiedenen Listen mit LINQ

//All list are filled from a file// 
if (DoctorList.Any(y => EpisodeList.Any(x => y.Debut == x.Story))) 
{ 
    Year.Text = x.Year.ToString(); 
    Episode.Text = x.Title; 
} 
if (DoctorList.Any(y => CompanionList.Any(c => y.docNum == c.Doctor))) 
{ 
    Companions.Items.Add(String.Format(c.Name + " (" + c.Actor + ")")); 
} 
if (CompanionList.Any(y => EpisodeList.Any(x => x.Story == y.Debut))) 
{ 
    Companions.Items.Add(String.Format(x.Title + " (" + x.Year + ")")); 
    Companions.Items.Add(""); 
} 

Ich habe 2 Probleme. 1 - Ich muss den Wert des gefundenen Objekts drucken. Im folgenden Code muss ich beispielsweise einen Wert innerhalb des Objekts x namens Jahr und den Wert Titel abrufen.

if (DoctorList.Any(y => EpisodeList.Any(x => y.Debut == x.Story))) 
{ 
    Year.Text = x.Year.ToString(); 
    Episode.Text = x.Title; 
} 

2 - ist mit der zweiten und dritten if-Anweisungen. Es könnte 30 verschiedene Begleiter geben, die zur listBox hinzugefügt werden sollten, aber mit diesen if-Anweisungen würde ich nur einen finden. Ich lerne immer noch, wie man LINQ-Anweisungen verwendet, und ich bin mir nicht sicher, wie ich mehrere Werte mit einem erhalten würde.

Antwort

2

Seine Art schwer zu verstehen, was Sie tun oder wollen

erreichen Aber Sie müssen Ihre Logik umkehren ich denke, so können Sie die Folge zugreifen

In Bezug auf Sie erste Frage, wenn Sie wollen einfach nur die erste Episode Zugang gefunden Sie nur so etwas wie dieses

var episode = EpisodeList.FirstOrDefault(x => DoctorList.Any(y => y.Debut == x.Story)); 
if (episode != null) 
{ 
    Debug.WriteLine($"year = {episode.Year}, Title = {episode.Title}"); 
} 

In Bezug auf Ihre zweite Frage tun können, wenn Sie mehrere Vorkommen haben, können Sie nur ein, wo tun, und in einer Liste auszuwählen, führen Sie die Formatierung auf dem fl y und fügen sie die Gefährten Liste tun (was auch immer das sein mag)

var namesActors = EpisodeList.Where(x => DoctorList.Any(y => y.docNum == x.Doctor)) 
    .Select(x => $"{x.Name} ({x.Actor})") 
    .ToList(); 

foreach (var value in namesActors) 
    Companions.Items.Add(value); 

var titleYears = EpisodeList.Where(x => DoctorList.Any(y => y.Debut == x.Story)) 
    .Select(x => $"{x.Title} ({x.Year})") 
    .ToList(); 

foreach (var value in titleYears) 
    Companions.Items.Add(value); 
+0

Das war hilfreich, aber bringt mich nicht, was ich brauchte. Companions ist eine Listbox. Auch die Ausgabe ist nicht das, was ich erwartet habe. Es druckt "x.Name (Name des Charakters) –

+1

@ZachLucas hat die Antwort aktualisiert, um Ihre Erwartungen widerzuspiegeln –

1

ich LINQ zuerst für die relevanten Objekte filtern verwenden würden.

Wenn Sie wissen, dass es höchstens 1 Objekt ist, das übereinstimmt, dann können Sie SingleOrDefault verwenden, die das Objekt zurückgibt, wenn es oder den Standardwert gefunden wird, die für Objekte null ist:

Episode e = EpisodeList.SingleOrDefault(x => DoctorList.Any(y => y.Debut == x.Story)) 
if (e != null) // found episode 
{ 
    Year.Text = e.Year.ToString(); 
    Episode.Text = e.Title; 
} 

Wenn es kann mehrere Ergebnisse, die Sie verwenden können, wo:

List<Episode> es = EpisodeList.Where(x => DoctorList.Any(y => y.Debut == x.Story)).ToList(); 
foreach (Episode e in es) 
{ 
    Companions.Items.Add(String.Format(e.Title + " (" + e.Year + ")")); 
    Companions.Items.Add(""); 
} 

Sie auch die folgende Syntax verwenden, die einfacher zu schreiben (wenn auch ein wenig weniger lesbar)

var es = EpisodeList.Where(x => DoctorList.Any(y => y.Debut == x.Story)); 
foreach (var e in es) 
{ 
    Companions.Items.Add(String.Format(e.Title + " (" + e.Year + ")")); 
    Companions.Items.Add(""); 
} 

Zusätzliche Informationen In LINQ lazy evaluation to SQL verwendet werden würde, also "ToList()" Kräfte sofort das Ergebnis aus der Datenbank zu erhalten. Dies ist, anstatt darauf zu warten, dass das Ergebnis verwendet wird (in diesem Fall durch Iterieren mit der foreach-Schleife). Sie können diesen Unterschied jedoch ignorieren, wenn Sie LINQ to SQL nicht verwenden.

+0

Dies ist sehr nah an dem, was ich brauche. Danke." –

Verwandte Themen