2009-02-06 11 views
34

Ich bin sehr neu zu Linq so nackt mit mir. Kann ich mehr als einen Artikel in einer Auswahl zurückgeben? Zum Beispiel habe ich eine Liste von Fixtures (denke Fußball (oder Fußball für die Yanks) Fixtures). Jedes Spiel enthält eine Heim- und Auswärtsmannschaft sowie eine Heim- und Auswärtswertung. Ich möchte alle Teams gewinnen, die gezeichnet haben. Ich möchte etwas verwenden, wieKann ich mehrere Objekte in einer Linq-Abfrage auswählen

IEnumerable<Team> drew = from fixture in fixtures 
         where fixture.Played && (fixture.HomeScore == fixture.AwayScore) 
         select fixture.HomeTeam && fixture.AwayTeam; 

Ich weiß, dass diese Syntax falsch ist, was ich nicht weiß, ist, wenn es möglich ist, dies zu tun. Benötige ich zwei Abfragen und verkette sie dann?

Edit: Dies ist wirklich eine Lernsache, so ist es nicht entscheidend, dies in einer bestimmten Weise zu erreichen. Grundsätzlich möchte ich zu diesem Zeitpunkt nur eine Liste der Teams, die gezeichnet haben. Eine Beispielanwendung könnte sein, dass ich für eine bestimmte Liste von Spielen alle gezogenen Teams finden kann, so dass ich ihre Tabelle in einer Tabelle um 1 Punkt verbessern kann (3 für einen Sieg, 0 für einen Verlust).

Prost James

Antwort

21

Ich glaube, Sie suchen die Methode Union wie folgt:

IEnumerable<Team> drew = (from fixture in fixtures 
        where fixture.Played 
         && (fixture.HomeScore == fixture.AwayScore) 
        select fixture.HomeTeam) 
        .Union(from fixture in fixtures 
        where fixture.Played 
         && (fixture.HomeScore == fixture.AwayScore) 
        select fixture.AwayTeam); 
+1

Gibt es ein LINQ-Schlüsselwort, das der Methode '.Union()' entspricht? –

30

101 LINQ Samples, nämlich Select - Anonyme Typen 1

... select new { HomeTeam = fixture.HomeTeam, AwayTeam = fixture.AwayTeam }; 
+0

Nicht die Antwort, die er sucht. Er möchte eine Liste von Teams, keine Liste von anonymen Typen mit Hometeam- und Auswärtsteameigenschaften. –

+0

Das ist wahr ... ich könnte es mit anonymen Typen umgehen ... nur gefragt, ob es eine Möglichkeit gäbe, nur eine Liste von Teams zu bekommen. Wenn es der einzige Weg ist, ist es –

+0

Ich stimme zu, dass dies keine Liste von Teams zurückgibt, aber ich denke es ist besser für ihn, seinen Code anzupassen, um diesen Anon-Typ zu unterstützen. Wenn James Hay seine Frage aktualisieren könnte, um seine Verwendung zu beschreiben, die helfen könnte. – bendewey

5

Edit: Sorry, Ihre ursprüngliche Frage falsch verstanden, so rewrote Antwort.

Sie könnten die „Select“ Operator verwenden zu tun, was Sie wollen:

IEnumerable<Team> drew = 
      (from fixture in fixtures 
      where fixture.Played && (fixture.HomeScore == fixture.AwayScore) 
        select new List<Team>() 
          { HomeTeam = fixture.HomeTeam, 
           AwayTeam = fixture.AwayTeam 
          }).SelectMany(team => team); 

Dies wird eine abgeflachte Liste der Teams zurück, die zog.

6

Oder Sie können einen Typ definieren, um all diese Daten zu halten:

IEnumerable<TeamCluster> drew = from fixture in fixtures 
         where fixture.Played && (fixture.HomeScore == fixture.AwayScore) 
         select new TeamCluster { 
          Team1 = fixture.HomeTeam, 
          Team2 = fixture.AwayTeam, 
          Score1 = fixture.HomeScore, 
          Score2 = fixture.AwayScore 
         }; 

class TeamCluster { 
    public Team Team1 { get; set; } 
    public Team Team2 { get; set; } 
    public int Score1 { get; set; } 
    public int Score2 { get; set; } 
} 
21

An (unabhängig) Variante John Preis-Lösung ...

IEnumerable<Team> drew = 
    from fixture in fixtures 
    where fixture.Played && (fixture.HomeScore == fixture.AwayScore) 
    from team in new[]{fixture.AwayTeam, fixture.HomeTeam} 
    select team; 

Sie in Erwägung ziehen könnte „ParticipatingTeams“ die Fixture-Klasse Hinzufügen zu bekommen:

IEnumerable<Team> drew = 
    from fixture in fixtures 
    where fixture.Played && (fixture.HomeScore == fixture.AwayScore) 
    from team in fixture.ParticipatingTeams 
    select team; 
+3

+1 für Ihre erste Abfrage - erfordert keine Vertragsänderung und ist effizienter als die führende Antwort. –

14

Ich nahm mir selbst die gleiche Version wie "es kommt drauf an".

Mit Abfrage-Syntax:

IEnumerable<Team> drew = 
    from fixture in fixtures 
    where fixture.Played && (fixture.HomeScore == fixture.AwayScore) 
    from team in new[]{fixture.AwayTeam, fixture.HomeTeam} 
    select team; 

mit Erweiterungsmethoden verwendet Lambda:

IEnumerable<Team> drew = 
    fixtures.Where(f => f.Played && f.HomeScore == f.AwayScore) 
    .SelectMany(f => new[]{f.HomeTeam, f.AwayTeam}); 

Edit: Ich weiß nicht, ob ein Team möglicherweise gespielt haben könnte und mehr als einmal gezeichnet in Ihrer Datenbank, aber wenn das möglich ist, möchten Sie vielleicht den Abfrageoperator Distinct verwenden:

IEnumerable<Team> drew = 
    (from fixture in fixtures 
    where fixture.Played && (fixture.HomeScore == fixture.AwayScore) 
    from team in new[]{fixture.AwayTeam, fixture.HomeTeam} 
    select team).Distinct(); 

oder:

IEnumerable<Team> drew = 
    fixtures.Where(f => f.Played && f.HomeScore == f.AwayScore) 
    .SelectMany(f => new[]{f.HomeTeam, f.AwayTeam}) 
    .Distinct(); 
+1

Letzte Probe arbeitete für mich. Habe mir auch beigebracht, dass man Typ-Inferenz verwenden kann, um Arrays zu deklarieren. Jeder Tag ist ein Schultag. – Gusdor

1

kam ich gegen ebendieser Frage auf und konnte nicht finden, was ich so schrieb ich eine kleine Erweiterung Methode wollte das tat, was ich wollte.

public static IEnumerable<R> MapCombine<M, R>(this IEnumerable<M> origList, params Func<M, R>[] maps) 
{ 
    foreach (var item in origList) 
    foreach (var map in maps) 
    { 
     yield return map(item); 
    } 
} 

das Problem in der Frage folgend, würden Sie dann so etwas wie diese

var drew = fixtures.Where(fixture => fixture.Played && 
         (fixture.HomeScore == fixture.AwayScore)) 
        .MapCombine(f => f.HomeTeam, f => f.AwayTeam); 

tun Interessanter intellisense darüber nicht gerade glücklich sind, bekommt man nicht den lamdba Ausdruck in der Spitze der Drop-Down, aber nach dem '=>' ist es ziemlich glücklich. Aber Hauptsache der Compiler ist glücklich.

Verwandte Themen