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