【问题标题】:How to combine objects in collection by equal property unsing LINQ?如何使用 LINQ 通过相等属性组合集合中的对象?
【发布时间】:2021-12-29 16:38:11
【问题描述】:

我有一个对象的集合

ObservableCollection<ISettingNode> nodes = new ObservableCollection<ISettingNode>() {
      new Node("Node1", tabs1);
      new Node("Node1", tabs2);
      new Node("Node1", tabs3);
      new Node("Node2", tabs4);
      new Node("Node3", tabs5);
}

你能告诉我如何从这个集合中得到一个集合,其中所有具有相同名称的对象将被合并到一个对象中。就我而言,我希望将集合的前三个元素作为一个元素,就像 Node("Node1", tabs) where tabs equal tabs1 + tabs2 + tabs3? 所以结果是:

ObservableCollection<ISettingNode> nodes = new ObservableCollection<ISettingNode>() {
      new Node("Node1", tabs);
      new Node("Node2", tabs4);
      new Node("Node3", tabs5);
}

我知道如何在没有 Linq 的情况下做到这一点,但它需要很多代码。我想使用 Linq 来获取它,但我不明白如何编写查询。

节点对象由简单的类表示:

  public class SettingNode : ISettingNode
    {
        public string Name { get; private set; }
        public IEnumerable<ISettingTab> Tabs { get; private set; }
    }

【问题讨论】:

    标签: c# linq collections


    【解决方案1】:

    您可以GroupBy ISettingNode.Name,然后将这些组重新投射到IEnumerable&lt;ISettingNode&gt; 中,并将标签组合在一起。

    假设Node 的构造函数可以采用IEnumerable&lt;ISettingTab&gt;...

    IEnumerable<ISettingNode> groupedNodes = nodes
        .GroupBy(node => node.Name)
        .Select(grp => new Node(grp.Key, grp.SelectMany(grpNode => grpNode.Tabs)));
    

    【讨论】:

      【解决方案2】:

      您可以对 IEnumerable 使用 GroupBy 语句。然后,您可以将其传递回 Observable 列表:

      nodes = new ObservableCollection<Node>(
                 nodes
                 .GroupBy(node => node.NodeName)
                 .Select(node => new Node(node.Key, node.Select(x => x.Tab)))
              ); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 2014-04-13
        • 1970-01-01
        相关资源
        最近更新 更多