簡體   English   中英

使用 linq 按父項對對象列表進行分組以輸出子元素

[英]Grouping a list of objects by parent using linq to output child elements

我對 linq groupby 有一個愚蠢的問題,我無法獨自工作。

基本上我有一個項目列表,我試圖通過它的 parentId 將詳細信息分組在一起

var list = new List<GroupItem>()
{
    new GroupItem() {Id = 1, Name = ".net"},
    new GroupItem() {Id = 2, Name = "asp.net", ParentId = 1},
    new GroupItem(){Id = 3,Name = "c#",ParentId = 1},
    new GroupItem(){Id = 4,Name = "php"},
    new GroupItem(){Id = 5,Name = "zend",ParentId = 4}
};

var group = from g in list
            group g by g.ParentId ==null
                into grouped
            select new
            {
                FrameworkId = grouped.Key,
                Items = (from g in list
                        where g.ParentId==g.ParentId
                        select g).ToList()

            };

foreach (var gi in group)
{

    Console.WriteLine(gi.FrameworkId);
    foreach (var item in gi.Items)
    {
        Console.WriteLine(item.Name);
    }
}

我究竟做錯了什么?

你的查詢好像太復雜了:

  1. 對於不為空的項目,您應該按ParentId分組
  2. 您不需要通過匹配ParentId再次查找項目,因為GroupBy運算符會為您完成

我的首選解決方案:

list.Where(x => x.ParentId != null)
    .GroupBy(x => x.ParentId, 
             (key, elements) => 
                new {
                  FrameworkId = key,
                  Items = elements.ToList()
                })
    .ToList();

您可以直接使用此查詢來過濾數據。

如果您想要沒有 ParentID 的數據,那么您可以使用下面提到的查詢

 var gr = list.Where(p => p.ParentId == 0).ToList();

如果您想要具有父 ID 的數據,則可以使用下面提到的代碼

 var gr1 = list.Where(p => p.ParentId != 0).ToList();

這是我的解決方案:

 list.Where(x => x.ParentId != null)
  .GroupBy(x => x.ParentId)
  .Select(x => new ParentViewModel {
     ParentId = x.Key.ParentId,
     Parent = x.ToList()
  })
  .ToList();

現在您將在ParentViewModel Parent 對象中獲得子項,例如Parent.Items

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM