如何使用 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)))
);
我有一个对象集合
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)))
);