假设我有以下数据
Key ID Data
A 1 Hello
A 2 World
B 2 Bar
B 1 Foo
我希望产生结果
A HelloWorld
B FooBar
我正在努力使语法正确 - 我试图使用Aggregate,但我不确定我是否可以(或应该)使用SelectMany
我会感激任何帮助。
Dim data = result.Rows.
GroupBy(Function(r) r.Key).
Select(Function(g) g.OrderBy(Function(s) s.ID)).
Aggregate(New StringBuilder, Function(cur, nxt)
cur.Append(nxt.First.Data))
由于
西蒙
答案 0 :(得分:11)
我认为这个(C#)应该有效:
var data = from r in result.Rows
group r by r.Item("Key").ToString() into g
select new {
g.Key,
Joined = string.Join("", g.OrderBy(s => s.Item("ID"))
.Select(s => s.Item("Data")))
};
答案 1 :(得分:2)
这是另一种实现方式:
var source = new Item[]
{
new Item { Key = "A", ID = 1, Data = "Hello" },
new Item { Key = "A", ID = 2, Data = "World" },
new Item { Key = "B", ID = 2, Data = "Bar" },
new Item { Key = "B", ID = 1, Data = "Foo" }
};
var results = source
.GroupBy(item => item.Key)
.Select(group => group
.OrderBy(item => item.ID)
.Aggregate(new Item(), (result, item) =>
{
result.Key = item.Key;
result.Data += item.Data;
return result;
}));
答案 2 :(得分:1)
Dim result = result.Rows.GroupBy(Function(r) r.Key).Select(Function(g) New With { _
g.Key, _
String.Join("", g.OrderBy(Function(r) r.ID)) _
})
答案 3 :(得分:1)
您不想聚合群组。您希望将每个组的元素聚合到自身。
如果您希望查询执行此操作,则
Dim data = result.Rows
.GroupBy( )
.Select(Function(g) g
.OrderBy( )
.Aggregate( )
)
如果匿名函数开始变得过于毛茸茸而无法编写,只需创建一个接受IGrouping<int, Row>
并将其转换为您想要的方法。然后称它为:
Dim data = result.Rows
.GroupBy( )
.Select( myMethod )