我正在尝试学习高级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();
提前致谢!
最佳答案
分组中的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);
关于c# - LINQ选择不同的项目和子项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30293912/