I have a C# type to generate Layer
SubLayer
:
public class Layer
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
}
And simulated a list with a Db
class:
public static class Db
{
public static IList<Layer> GetLayers()
{
return new List<Layer>
{
new Layer{Id = 1, ParentId = 0, Name = "First Layer" },
new Layer{Id = 2, ParentId = 1, Name = "First SubLayer1" },
new Layer{Id = 3, ParentId = 1, Name = "First SubLayer2" },
new Layer{Id = 4, ParentId = 1, Name = "First SubLayer3" },
new Layer{Id = 5, ParentId = 0, Name = "Second Layer" },
new Layer{Id = 6, ParentId = 5, Name = "Second SubLayer1" },
new Layer{Id = 7, ParentId = 5, Name = "Second SubLayer2" },
new Layer{Id = 8, ParentId = 7, Name = "Sub -3" }
};
}
}
I want to get a serialized JSON object, so I created a service class to generate and changed the Layer
class:
public class Layer
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
public IList<Layer> ChildLayers { get; set; }
public Layer()
{
ChildLayers = new List<Layer>();
}
}
public class LayerService
{
public IList<Layer> GetLayers()
{
IList<Layer> data = Db.GetLayers();
IList<Layer> hierarcy = new List<Layer>();
foreach (var layer in data)
{
var layer1 = layer;
var sublayers = data.Where(i => i.ParentId == layer1.Id && i.ParentId !=0);
var enumerable = sublayers as Layer[] ?? sublayers.ToArray();
if(enumerable.Any() && layer.ParentId ==0)
hierarcy.Add(layer);
foreach (var sublayer in enumerable)
{
layer.ChildLayers.Add(sublayer);
}
}
return hierarcy;
}
}
But this LayerService
code is ugly. Is there any practical way with Linq or else? Is there a cleaner way?