我正在尝试学习高级LINQ技术,那么,如果仅使用LINQ,我们如何才能实现选择集合中不同的项并将它们的子项合并到字典/结构或动态ExpandoObject中的方法?

可以说我有这两类:

public class TestItem
{
    public int Id;
    public string Name;
    public List<TestSubItem> SubItems;
}

public class TestSubItem
{
    public string Name;
}


我如何创建一个LINQ查询(再次,如果可能的话)以基于Name属性选择所有不同的TestItem,并且如果两次发现相同的TestItem具有相同的名称,则将两个List合并到最终结果中吗?

我知道我可以通过执行以下代码来选择不同的TestItem,但是我被困在那里:

    var result = items.GroupBy(item => item.Name)
                      .ToList();


提前致谢!

最佳答案

分组中的SelectAggregate组合可以完成工作。最后,ToDictionary调用清除所有内容并清除可能无效的ID字段:

var result = items.GroupBy(item => item.Name)
                  .Select(g => g.Aggregate((i, j) =>
                  {
                      i.SubItems.AddRange(j.SubItems);
                      return i;
                  }))
                  .ToDictionary(k => k.Name, v => v.SubItems);


或者,查询语法稍微冗长一些,但我发现它更易于阅读:

var result = (from item in items
                group item by item.Name
                into g
                let n =
                    from ti in g
                    select ti.Name
                let i =
                    from ti in g
                    from si in ti.SubItems
                    select si
                select new { n, i }).ToDictionary(k => k.n, v => v.i);

关于c# - LINQ选择不同的项目和子项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30293912/

10-16 07:34