簡體   English   中英

使用LINQ選擇帶有其他對象列表的對象

[英]Selecting objects with list of other objects using LINQ

我想選擇對象(A),其中屬性之一是對象(B)的列表,並根據對象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)));

實際上,您的要求需要使用減少的玩家數量來創建新的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       
    });

這可能是您實際想要的,也可能不是。 似乎有點尷尬,因為例如,團隊名稱與原始團隊相同,但是名冊減少了。

另一個選擇是擁有一個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屬性中訪問它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM