Home > Back-end >  Find two values in hierarchical object tree C# using Linq
Find two values in hierarchical object tree C# using Linq

Time:09-15

I have the following structures:

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} } };
        
        //Console.WriteLine(tourn.Tables.Where((k=> k.Tables.Any(m=> m.Seats.Any(j=> j.Player == Player.User)))).Count());
        
        // Get Table and Seat numbers for 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; }
    }
}

I have want the table and seat number where the playertype = user

Is it possible to build a Linq query to do this in one statement?

(I have looked at many examples and can't seem to get it right)

Tried this:

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
            })
        });

Fiddle (.NET Core): https://dotnetfiddle.net/CMjZs6

CodePudding user response:

I am not sure on the requirement. But I am attaching a fiddle

https://dotnetfiddle.net/K4adT9

    var lst = new List<Tournament>();
    var tourn = new Tournament();
    var seat1 = new Seat() { Number = 1, Player = Player.User } ;
    tourn.Tables = new List<Table>() { new Table(){ Seats = new List<Seat>(){seat1} } };
    lst.Add(tourn);
    
    Console.WriteLine(lst.Where((k=> k.Tables.Any(m=> m.Seats.Any(j=> j.Player == Player.User)))).Count());

Please update the fiddle as per your requirement.

CodePudding user response:

I cheated...

                PlayerLocation location = new PlayerLocation();

                foreach (Table table in tables)
                    foreach (Seat seat in table.Seats)
                        if (seat.Player is not null && seat.Player.Type == PlayerType.User)
                        {
                            location.TableNumber = table.TableNumber;
                            location.SeatNumber = seat.Number;
                            break;
                        }
  • Related