如何在C#层级对象树中用Linq查找用户玩家的桌号与座位号
如何用单条LINQ语句获取指定玩家类型的桌号与座位号?
原代码结构
using System.Collections.Generic; public class Program { public static void Main() { var tourn = new Tournament(); var player = new Player() { Type = PlayerType.User }; var seat1 = new Seat() { Number = 1, Player = player } ; tourn.Tables = new List<Table>() { new Table(){ Seats = new List<Seat>(){seat1} } }; // 获取PlayerType.User对应的桌号与座位号 } public class Seat{ public Player? Player {get;set;} public int Number {get;set;} } public enum PlayerType { User, Bot } public class Tournament{ public List<Table> Tables {get;set;} } public class Table { public List<Seat> Seats {get;set;} public int Number {get;set;} } public class Player { public PlayerType Type { get; set; } } }
需求说明
想要获取PlayerType等于User的玩家对应的桌号与座位号,是否可以用一条LINQ语句实现?
尝试过的代码
var playerLocation = tables .Select(seat => new { TableNumber = seat.TableNumber, TableSeat = seat.Seats .Where(s => s.Player is not null && s.Player.Type == PlayerType.User) .Select(st => new { SeatNumber = st.Number }) });
解决方案
可以用单条LINQ语句实现,推荐使用SelectMany扁平化结果,直接得到每个用户玩家对应的桌号和座位号:
var userLocations = tourn.Tables .SelectMany(table => table.Seats .Where(seat => seat.Player != null && seat.Player.Type == PlayerType.User) .Select(seat => new { TableNumber = table.Number, SeatNumber = seat.Number }) );
代码说明:
SelectMany遍历每张桌子,将符合条件的座位与对应桌号组合,最终返回扁平集合,每个元素是包含桌号和座位号的匿名类型对象。- 先用
Where筛选出存在玩家且类型为User的座位,再通过Select提取需要的信息。 - 相比你之前的代码,这个结果不会包含无用户玩家的桌子,也没有嵌套集合结构,更便于后续使用。
内容的提问来源于stack exchange,提问作者David Cornelson
相关产品推荐
相关产品推荐

