我正在尝试学习高级 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 具有相同的名称以合并最终结果中的两个列表?
我知道我可以通过执行以下代码来选择不同的 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/