【问题标题】:LINQ select distinct items and subitemsLINQ 选择不同的项目和子项目
【发布时间】:2015-05-18 01:30:34
【问题描述】:

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

提前致谢!

【问题讨论】:

  • 您能提供样本数据和想要的结果吗?
  • 在合并步骤中,您可以丢失一些 ID?
  • 是的,它用于显示目的。
  • 您想要一本字典,还是只想合并同名列表?如果是字典,键是名称,值是合并列表?
  • 正是我想要的。

标签: c# .net linq


【解决方案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);

【讨论】:

  • 谢谢,您的示例为我指明了完成查询的正确方向。
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 2019-10-18
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
相关资源
最近更新 更多