我正在尝试学习高级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();
提前致谢!
答案 0 :(得分:1)
分组上Select
和Aggregate
的组合应该可以完成工作。最后,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);