LINQ选择不同的项目和子项目

时间:2015-05-18 01:30:34

标签: c# .net linq

我正在尝试学习高级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();

提前致谢!

1 个答案:

答案 0 :(得分:1)

分组上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);