使用LINQ选择带有其他对象列表的对象

时间:2018-10-22 18:33:13

标签: c# linq

我想选择其中一个属性是对象列表(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)));

2 个答案:

答案 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属性中访问它们。