2009-02-06 66 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表达下降,然而在'=>'之后它很开心。但主要的是编译器很高兴。

相关问题