【问题标题】:Combine Parent and Child Lists into a single nested Parent List将父列表和子列表组合成一个嵌套的父列表
【发布时间】:2020-07-22 03:44:34
【问题描述】:

我有两个列表,一个父列表 (parents) 和一个子列表 (children),其中子列表具有 parentId。

List<Parent> parents
List<Child> children

我试图将这两个列表组合成一个父列表,每个父对象都有一个子列表。我目前正在遍历父列表并根据 parentId 在每个父对象中填充子列表,但我想知道是否有更快的方法来使用 LINQ。

foreach (var parent in parents)
{
   parent.Children = children.Where(c=>c.ParentId == parent.Id).ToList();
}

有什么建议吗?

【问题讨论】:

    标签: linq


    【解决方案1】:

    您可以使用Join,结合GroupBy

    var parentChildrenQry =
        from parent in parents
        join child in children on parent.Id equals child.ParentId
        group child by parent;
    
    foreach(var grp in parentChildrenQry) {
        grp.Key.Children = grp.ToList();
    }
    

    或在一个声明中使用GroupJoin

    var parentChildrenQry =
        parents.GroupJoin(children, parent.Id, child.ParentId, new { (parent, childGrp) => new { Parent = parent, Children = childGrp.ToList() } );
    
    foreach(var grp in parentChildrenQry) {
        grp.Parent.Children = grp.Children;
    }
    

    【讨论】:

      【解决方案2】:

      从性能的角度来看,您的 foreach 没有任何问题。

      如果你的代码足够可读,那么让你的代码变得 linq 和花哨是没有意义的。

      如果您的集合非常大,从性能的角度来看,如果您首先按父 ID 对子组进行分组,然后按父 ID 对组进行排序,然后将它们附加到已排序的父项,则可能是最有效的。

      【讨论】:

        【解决方案3】:

        我知道这是一个老问题,但我想分享我的经验

        对我来说,我在数据库中有很多记录,因此性能很重要,我以另一种方式创建它,并以大约 3 倍的速度获得结果。我在一次选择中获取所有数据,然后将结果放入我的模型中。

        我有包含菜单和菜肴表的餐厅数据库。

        首先,这些是处理所选数据的类模型,与数据库模型不同

        public class Menu
        {
            public Menu()
            {
                Dishes = new List<Dish>();
            }
        
            public long ID { get; set; }
            public string Name { get; set; }
            public string ImagePath { get; set; }
            public List<Dish> Dishes { get; set; }
        }
        
        public class Dish
        {
            public long ID { get; set; }
            public string Name { get; set; }
            public string PicturePath { get; set; }
            public double Price { get; set; }
        }
        

        这是 Linq 查询

        var all = (from m in contexts.RestMenus
                    join d in contexts.ResDishes on m.Id equals d.MenuID
                    select new
                    {
                        Menu = new Menu()
                        {
                            ID = m.MenuID,
                            Name = m.Name,
                            ImagePath = m.ImageURL
                        },
                        Dish = new Dish()
                        {
                            ID = d.ItemID,
                            Name = d.Name,
                            PicturePath = d.PicturePath,
                            Price = d.DefaultPrice
                        }
                    }).ToList();
        

        和foreach循环来排列数据

        List<Menu> menus = new List<Menu>();
        foreach (var r in all)
        {
            Menu m = menus.Find(x => x == r.Menu);
            if (m == null)
            {
                menus.Add(r.Menu);
                m = r.Menu;
            }
            m.Dishes.Add(r.Dish);
        }
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-12
          • 1970-01-01
          • 2020-06-01
          • 1970-01-01
          • 2023-01-09
          • 1970-01-01
          • 2019-09-08
          • 1970-01-01
          相关资源
          最近更新 更多