[英]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.