You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
        })
    );

代码说明:

  1. SelectMany遍历每张桌子,将符合条件的座位与对应桌号组合,最终返回扁平集合,每个元素是包含桌号和座位号的匿名类型对象。
  2. 先用Where筛选出存在玩家且类型为User的座位,再通过Select提取需要的信息。
  3. 相比你之前的代码,这个结果不会包含无用户玩家的桌子,也没有嵌套集合结构,更便于后续使用。

内容的提问来源于stack exchange,提问作者David Cornelson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 04:40:18