如何使用 LINQ 通过等于 属性 组合集合中的对象?

How to combine objects in collection by equal property unsing LINQ?

我有一个对象集合

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) 其中 tabs 等于 tabs1 + tabs2 + tabs3? 所以结果将是:

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

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

节点对象由简单的 class:

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

您可以 GroupBy ISettingNode.Name,然后将这些组投影回 IEnumerable<ISettingNode> 并将选项卡组合在一起。

假设 Node 的构造函数可以采用 IEnumerable<ISettingTab>...

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

您可以对 IEnumerable 使用 GroupBy 语句。然后你可以将它传递回一个 Observable 列表:

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