c# - LINQ 选择不同的项目和子项目

标签 c# .net 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 具有相同的名称以合并最终结果中的两个列表?

我知道我可以通过执行以下代码来选择不同的 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/

相关文章:

.net - Entity Framework 中的第二个 self 关系

c# - 灯光开关 : How do I place my business logic into a separate assembly?

c# - Linq 多重连接 - 结果太多

c# - GroupCollection 上无法访问的可枚举扩展方法

c# - Selenium C# 的第二个测试方法失败

c# - WPF中不同窗口之间的数据共享

.net - 如何判断连接是否按流量计费?

c# - 登录前握手期间发生错误

c# - 异步 TCP System.Net.Socket 发送(开始/结束发送)实际上没有发送任何东西

C# 相当于 ruby​​ 的字符串后继方法 ("abcd".succ -> "abce")