我想选择其中一个属性是对象列表(B)的对象(A),并根据对象A和对象B的标准选择仅匹配的对象。
例如:
class Team //objects A
{
public string TeamName { get; set; }
public int StadiumName { get; set; }
public List<Player> Players { get; set; }
public string Country { get; set; }
}
class Player //objects B
{
public string Name { get; set; }
public int Age { get; set; }
public float Height { get; set; }
public float Weight { get; set; }
}
我的团队中有一些球员,我想选择国家/地区为英格兰的球队,并且该球队中只有年龄超过28岁的球员。例如,有三支球队,每支球队有16名球员。这些队伍中只有两个来自英格兰。因此,结果应该是两支球队的名单,其中只有超过28岁的球员名单(因此球员名单可能由0到16名球员组成)
我写了一些linq,但是它返回了包含所有球员(其中16人)的球队,或者如果没有年龄大于28岁的球员返回null:
teams.Where(team => team.Country == "England" && team.Players.Any(player => (player.Age > 28)));
答案 0 :(得分:6)
您的要求本质上是必须创建一个减少玩家人数的新Team
对象(或者将年轻的玩家从原始Team
对象中永久删除)。
var teamsEnglandOnlyOver28Years =
teams
// Only teams from England
.Where(t => t.Country == "England")
// Create a new instance with only the older players
.Select(t => new Team()
{
TeamName = t.TeamName,
StadiumName = t.StadiumName,
Players = t.Players.Where(p => p.Age > 28).ToList(),
Country = t.Country
});
这可能是您实际想要的,也可能不是。似乎有点尴尬,因为例如,团队名称与原始团队相同,但名册减少了。
答案 1 :(得分:3)
另一种选择是拥有一种GetPlayers(Func<Player,bool> condition)
方法,您可以使用该方法来获取已过滤的玩家:
class Team
{
public string TeamName { get; set; }
public int StadiumName { get; set; }
public List<Player> Players { get; set; }
public string Country { get; set; }
public IEnumerable<Player> GetPlayers(Func<Player, bool> condition)
{
return Players.Where(condition);
}
}
这是比通过过滤后的播放器返回新对象更好的解决方案,因为过滤后的播放器不会丢失,您可以从Players
属性中访问它们。