Search code examples
c#listlinq

Nested List how to extract object using linq


I have below nested lists, and I would like to extract uiparameter object with particular uiparameterName, but I don't know how write the linq expression.

public class root
{
  public List<module> module{get; set;}
}

public class module
{
 public int moduleID {get; set;}
 public string moduleName {get; set;}
 public List<parameter> parameters {get;set;}
}

public class parameter
{
 public int parameterID {get; set;}
 public string parameterName {get; set;}
 public List<uiparameter> uiparameters{get;set;}

}
public class uiparameter
{
 public int uiparameterID {get; set;}
 public string uiparameterName {get; set;}
 public string uiparameterdesc {get; set;}

}

Solution

  • You should use SelectMany to flatten it like this:

    var uiParams = myRoot.module.SelectMany(x => x.parameters)
                                .SelectMany(y => y.uiparameters)
                                .Where(z => z.uiparameterdesc == "I'm a ui param");
    

    This will return an IEnumerable of all the ones that match the description you've searched for.

    Here it is working in a console app:

        static void Main(string[] args)
        {
            var myRoot = new root
            {
                module = new List<module>
                {
                    new module
                    {
                        moduleID = 1,
                        moduleName = "moduleA",
                        parameters = new List<parameter>
                        {
                            new parameter
                            {
                                parameterID = 1,
                                parameterName = "paramA",
                                uiparameters = new List<uiparameter>
                                {
                                    new uiparameter { uiparameterID = 1, uiparameterName = "uiParamA", uiparameterdesc = "I'm a ui param" },
                                    new uiparameter { uiparameterID = 2, uiparameterName = "uiParamB", uiparameterdesc = "I'm a ui param too" }
                                }
                            },
                            new parameter
                            {
                                parameterID = 2,
                                parameterName = "paramB",
                                uiparameters = new List<uiparameter>
                                {
                                    new uiparameter { uiparameterID = 3, uiparameterName = "uiParamC", uiparameterdesc = "I'm a ui param" },
                                    new uiparameter { uiparameterID = 4, uiparameterName = "uiParamD", uiparameterdesc = "I'm a ui param too" }
                                }
                            }
                        }
                    },
                    new module
                    {
                        moduleID = 2,
                        moduleName = "moduleB",
                        parameters = new List<parameter>
                        {
                            new parameter
                            {
                                parameterID = 1,
                                parameterName = "paramC",
                                uiparameters = new List<uiparameter>
                                {
                                    new uiparameter { uiparameterID = 5, uiparameterName = "uiParamE", uiparameterdesc = "I'm a ui param" },
                                    new uiparameter { uiparameterID = 6, uiparameterName = "uiParamF", uiparameterdesc = "I'm a ui param too" }
                                }
                            },
                            new parameter
                            {
                                parameterID = 2,
                                parameterName = "paramD",
                                uiparameters = new List<uiparameter>
                                {
                                    new uiparameter { uiparameterID = 7, uiparameterName = "uiParamG", uiparameterdesc = "I'm a ui param" },
                                    new uiparameter { uiparameterID = 8, uiparameterName = "uiParamH", uiparameterdesc = "I'm a ui param too" }
                                }
                            }
                        }
                    }
                }
            };
    
            var uiParams = myRoot.module.SelectMany(x => x.parameters)
                                        .SelectMany(y => y.uiparameters)
                                        .Where(z => z.uiparameterdesc == "I'm a ui param");
    
            Console.WriteLine("UI Parameters:");
            foreach (var uip in uiParams)
            {
                Console.WriteLine("Param Id: " + uip.uiparameterID + ", Param Name: " + uip.uiparameterName);
            }
    
            Console.ReadLine();
        }
    

    Results:

    enter image description here