Rudy W
Rudy W

Reputation: 77

Linq on nested lists c#

I have a hierarchy that looks like this:

public class GetCategoriesReply : BaseReply
{
    public IEnumerable<Subsystem> Categories { get; set; }
}
public class Subsystem
{
    public IEnumerable<cat1> cat1 { get; set; }
    public string id { get; set; }
    public string name { get; set; }
}
public class cat1
{
    public IEnumerable<cat2> cat2 { get; set; }
    public string id { get; set; }
    public string name { get; set; }

}
public class cat2
{
    public IEnumerable<cat3> cat3 { get; set; }
    public string id { get; set; }
    public string name { get; set; }

}
public class cat3
{
    public string id { get; set; }
    public string name { get; set; }

}

I would like to get the list of Cat3 out from the query if possible. I have tried this but don't get it to work :

var cat3list = categoryList.Categories
            .Where(s => s.name == "Payment")
            .Select(x => x.cat1.Where(c => c.name == "Admin").SelectMany(y => y.cat2.Select(z => z.cat3))
            .ToList());

Any suggestions? Kind regards /Rudy

Upvotes: 1

Views: 104

Answers (3)

LDS
LDS

Reputation: 362

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace memorystreams
{
    public class GetCategoriesReply : BaseReply
    {
        public IEnumerable<Subsystem> Categories { get; set; }
    }
    public class Subsystem
    {
        public IEnumerable<cat1> cat1 { get; set; }
        public string id { get; set; }
        public string name { get; set; }
    }
    public class cat1
    {
        public IEnumerable<cat2> cat2 { get; set; }
        public string id { get; set; }
        public string name { get; set; }

    }
    public class cat2
    {
        public IEnumerable<cat3> cat3 { get; set; }
        public string id { get; set; }
        public string name { get; set; }

    }
    public class cat3
    {
        public string id { get; set; }
        public string name { get; set; }

    }
    public class Result
    {
        public void showlist()
        {
           
            List<cat3> sc3 = new List<cat3>();
            List<cat2> sc2 = new List<cat2>();
            List<cat1> sc1 = new List<cat1>();
            List<Subsystem> sub1 = new List<Subsystem>();
            cat3 cat3_obj = new cat3();
            cat3_obj.id = "3";
            cat3_obj.name = "A";
            cat3 cat3_obj1 = new cat3();
            cat3_obj1.id = "33";
            cat3_obj1.name = "B";
            sc3.Add(cat3_obj);
           // sc3.Add(cat3_obj1);

            cat2 cat2_obj = new cat2();
            cat2_obj.id = "2";
            cat2_obj.name = "A";
            cat2_obj.cat3 = sc3;

            cat2 cat2_obj1 = new cat2();
            cat2_obj1.id = "22";
            cat2_obj1.name = "B";
            cat2_obj1.cat3 = sc3;
            sc2.Add(cat2_obj);
            //sc2.Add(cat2_obj1);

            cat1 cat1_obj = new cat1();
            cat1_obj.id = "1";
            cat1_obj.name = "A";
            cat1_obj.cat2 = sc2;
            cat1 cat1_obj1 = new cat1();
            cat1_obj1.id = "11";
            cat1_obj1.name = "B";
            cat1_obj1.cat2 = sc2;
            sc1.Add(cat1_obj);
           // sc1.Add(cat1_obj1);

            Subsystem ob = new Subsystem();
            ob.id = "S1";
            ob.name = "Sub system";
            ob.cat1 = sc1;
            sub1.Add(ob);
            GetCategoriesReply getCategories = new GetCategoriesReply();

            getCategories.Categories = sub1;


            var catagory3 = (from c1 in getCategories.Categories.Select(x => x.cat1.Select(y => y.cat2.Select(z => z.cat3))) select c1).FirstOrDefault();

            var idob =  catagory3.ToArray()[0];
            var objs = idob.ToArray()[0];
            var strid = objs.ToArray()[0].id;

        }
    }
   public class BaseReply
   {

   }
}

Upvotes: 1

Njara Liantsoa
Njara Liantsoa

Reputation: 84

You should use the LINQ SelectMany operator if you want to get directly the list of the category cat3 because with le operater Select , it will return the list of the list. It will work you can try it.

 var cat3list = categoryList.Categories
        .Where(s => s.name == "Payment")
        .SelectMany(x => x.cat1.Where(c => c.name == "Admin").SelectMany(y => y.cat2.SelectMany(z => z.cat3))
        .ToList());

Thanks Njara

Upvotes: 0

Ashkan Mobayen Khiabani
Ashkan Mobayen Khiabani

Reputation: 34152

var cat3list = Categories.Where(s => s.name == "Payment")
      .SelectMany(x => x.cat1).Where(c => c.name == "Admin")
      .SelectMany(x => x.cat2)
      .SelectMany(x => x.cat3).ToList();

Upvotes: 5

Related Questions