我有一个c#类型来生成Layer SubLayer。
public class Layer
{
public int Id { get; set; }
public int ParentId { get; set; }
public string Name { get; set; }
}
使用Db类模拟一个列表。
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" }
};
}
}
所以我想获得一个Serialized Json对象。我停止了服务类来生成,
并更改了Layer类:
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;
}
}
但是这个LayerService代码很难看。 linq还有其他实用的方法吗?干净的代码方式?
答案 0 :(得分:0)
如果您想使用LINQ,可能下面的代码可以帮助您:
public IList<Layer> GetLayers()
{
IList<Layer> data = Db.GetLayers();
IList<Layer> hierarcy = new List<Layer>();
data.Where(x => x.ParentId == 0).ToList().ForEach(x => hierarcy.Add(x)); //get parent
data.Where(a => a.ParentId != 0).ToList().
ForEach(a =>
{
hierarcy.Where(b => b.Id == a.ParentId).ToList().ForEach(c => c.ChildLayers.Add(a)); //get childrens
});
return hierarcy;
}