问题描述
|
假设我有以下数据
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))
谢谢
西蒙
解决方法
我认为此(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\")))
};
, 这是另一种实现方式:
var source = new Item[]
{
new Item { Key = \"A\",ID = 1,Data = \"Hello\" },new Item { Key = \"A\",ID = 2,Data = \"World\" },new Item { Key = \"B\",Data = \"Bar\" },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;
}));
, Dim result = result.Rows.GroupBy(Function(r) r.Key).Select(Function(g) New With { _
g.Key,_
String.Join(\"\",g.OrderBy(Function(r) r.ID)) _
})
, 您不想汇总组。您想将每个组的元素加在一起。
如果您希望查询执行此操作,则
Dim data = result.Rows
.GroupBy( )
.Select(Function(g) g
.OrderBy( )
.Aggregate( )
)
如果那个匿名函数开始变得太冗长而无法编写,则只需创建一个接受IGrouping<int,Row>
并将其转换为所需内容的方法即可。然后像这样调用它:
Dim data = result.Rows
.GroupBy( )
.Select( myMethod )