2009-02-06 104 views
34

我對Linq很陌生,對我很陌生。我可以在選擇中返回多個項目嗎?例如,我有一個燈具列表(想想足球(或足球)的夾具)。每個燈具都包含主客場球隊和主客場比分。我想要得到所有畫的隊伍。我想使用類似我可以在Linq查詢中選擇多個對象嗎?

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

我知道這個語法是不正確的,我不知道是否有可能這樣做。我需要兩個查詢然後連接它們嗎?

編輯:這實在是一個學習的東西,所以以任何特定的方式實現這一點並不關鍵。基本上,在這個階段,我想要的是一個已經繪製的球隊列表。一個例子的用法可能是,對於一個給定的裝置列表,我可以找到所有被抽中的球隊,這樣我就可以在1張牌桌上更新他們的排名(3勝1負)。

乾杯 詹姆斯

回答

21

我認爲你正在尋找的聯盟方法如下:約翰

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); 
30

101 LINQ Samples,即選擇 - 匿名類型1

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

不是他正在尋找的答案。他想要一個團隊名單,而不是一個匿名類型的列表與hometeam和awayteam屬性。 – 2009-02-06 15:51:06

+0

這是真的......我可以用匿名類型繞過它......只是想知道是否有辦法得到一個團隊名單。如果這是唯一的方法,但它是唯一的方法 – 2009-02-06 15:52:23

+0

我同意這不會返回一個隊列表,但我認爲它更好地讓他適應他的代碼來處理這個匿名類型的支持。如果詹姆斯海可以更新他的問題來描述他的語言,那可能會有所幫助。 – bendewey 2009-02-06 15:59:26

5

編輯:對不起,誤會了你原來的問題,所以重寫了答案。

您可以使用「的SelectMany」運營商做你想要什麼:

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

這將返回,吸引團隊的扁平列表。

6

或者你也可以定義一個類型來保存所有的數據:

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

的(獨立的)變化價格的解決方案...

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

你可以考慮添加「ParticipatingTeams」到Fixture類得到:

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

對此我自己一個刺傷,我想出了'它取決於'相同的版本。

使用查詢理解語法:

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

使用帶有擴展方法拉姆達:

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

編輯:我不知道,如果一個團隊本來可能發揮和渲染不止一次在您的數據庫中,但如果可能的話,那麼您可能想要使用Distinct查詢運算符:

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(); 

或:

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

我碰到了這個非常問題,找不到我想要的東西,所以我寫了做了什麼,我想一個小擴展方法。

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

繼在討論的問題,那麼您需要做這樣的事情

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

有趣的智能感知是不完全高興這一點,你沒有得到在頂部lamdba表達下降,然而在'=>'之後它很開心。但主要的是編譯器很高興。

相關問題