以下将返回一个 IEnumerable:
IEnumerable<Team> drew =
from fixture in fixtures
where fixture.Played && (fixture.HomeScore == fixture.AwayScore)
from team in new[]{fixture.HomeTeam, fixture.AwayTeam}
select team;
或者,使用流畅的 LINQ 风格:
IEnumerable<Team> drew =
fixtures
.Where(fxtr => fxtr.Played && (fxtr.HomeScore == fxtr.AwayScore))
.SelectMany(fixture => new[]{fixture.HomeTeam, fixture.AwayTeam});
扁平化和平面地图
此要求通常称为“扁平化”。也就是说,获取一个 > 并将其转换为一个 。
SelectMany 既映射(一个固定到一个团队的阵列)和展平(一个团队阵列的序列到一个团队的序列)。类似于Java、JavaScript等其他语言中的“flatMap”功能。
可以将 Mapping 和 Flattening 分开:
IEnumerable<Team> drew =
fixtures
.Where(fxtr => fxtr.Played && (fxtr.HomeScore == fxtr.AwayScore))
// map
.Select(fixture => new[]{fixture.HomeTeam, fixture.AwayTeam})
// flatten
.SelectMany(teams => teams);
其他方法
迭代器块
使用迭代器块也可以达到同样的效果,但我怀疑这很少是最好的方法:
IEnumerable<Team> Drew(IEnumerable<Fixture> fixtures){
var draws =
fixtures
.Where(fxtr => fxtr.Played && (fxtr.HomeScore == fxtr.AwayScore));
foreach(var fixture in draws){
yield return fixture.HomeTeam;
yield return fixture.AwayTeam;
}
}
联合
联合也是一种选择,但有可能产生与上述不同的结果:
结果的顺序会有所不同。返回所有 Home 结果,然后返回所有 Away 结果。
Union 枚举了两次固定装置,因此,根据固定装置的实现方式,固定装置可能会在调用之间更新。例如,如果在通话之间添加了新的抽签赛程,则可以返回客队,但不能返回主队。
正如迈克鲍威尔所描述的:
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 );
根据固定装置的来源/实现方式,可能值得考虑“缓存”绘制的固定装置以避免必须枚举固定装置两次。
var draws =
( from fixture in fixtures
where fixture.Played && (fixture.HomeScore == fixture.AwayScore)
select fixture
).ToList();
IEnumerable<Team> drew =
(from draw in draws select draw.HomeTeam)
.Union(from draw in draws select draw.AwayTeam);
或者使用流畅的风格:
var draws =
fixtures
.Where(fxtr => fxtr.Played && (fxtr.HomeScore == fxtr.AwayScore))
.ToList();
IEnumerable<Team> drew =
draws.Select(fixture => fixture.HomeTeam)
.Union(draws.Select(fixture => fixture.AwayTeam));
修改 Fixture 类
可以考虑将“ParticipatingTeams”添加到 Fixture 类中以获得:
IEnumerable<Team> drew =
from fixture in fixtures
where fixture.Played && (fixture.HomeScore == fixture.AwayScore)
from team in fixture.ParticipatingTeams
select team;
但正如@MattDeKrey 指出的那样,这需要更改合同。
代码示例
代码示例可在Repl.it获取