c#嵌套对象到分层对象列表

时间:2015-08-31 13:36:24

标签: c# linq hierarchical-data

我有一个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还有其他实用的方法吗?干净的代码方式?

1 个答案:

答案 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;
        }