Vb.net 使用Linq对字符串进行分组、排序和连接
假设我有以下数据Vb.net 使用Linq对字符串进行分组、排序和连接,vb.net,linq,Vb.net,Linq,假设我有以下数据 Key ID Data A 1 Hello A 2 World B 2 Bar B 1 Foo 我期待着产生结果 A HelloWorld B FooBar 我正在努力使语法完全正确-我试图使用聚合,但我不确定是否可以(或应该)使用SelectMany 如果有任何帮助,我将不胜感激 Dim data = result.Rows.
Key ID Data
A 1 Hello
A 2 World
B 2 Bar
B 1 Foo
我期待着产生结果
A HelloWorld
B FooBar
我正在努力使语法完全正确-我试图使用聚合,但我不确定是否可以(或应该)使用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")))
};
我认为这(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")))
};
您不想聚合这些组。您希望将每个组的元素聚合到它自己 如果希望查询执行此操作,则
Dim data = result.Rows
.GroupBy( )
.Select(Function(g) g
.OrderBy( )
.Aggregate( )
)
如果匿名函数开始变得太复杂而无法编写,只需创建一个接受i分组的方法,并将其转换为您想要的。那么就这样称呼它:
Dim data = result.Rows
.GroupBy( )
.Select( myMethod )
您不想聚合这些组。您希望将每个组的元素聚合到它自己
如果希望查询执行此操作,则
Dim data = result.Rows
.GroupBy( )
.Select(Function(g) g
.OrderBy( )
.Aggregate( )
)
如果匿名函数开始变得太复杂而无法编写,只需创建一个接受i分组的方法,并将其转换为您想要的。那么就这样称呼它:
Dim data = result.Rows
.GroupBy( )
.Select( myMethod )
下面是一个替代实现:
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;
}));
下面是一个替代实现:
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;
}));
你能把你的代码放在这里吗?我的理解正确吗?你想让同一个键的单词按照ID的顺序连接在一起?结果是一个DataTable
?@Matt-是的,@Magnus-我不介意,@Pr0fess0rX-我已经包含了代码,我马上会把它更新为C#你能把你的代码u放到目前为止吗?我的理解正确吗?你想把同一个键的单词按照ID的顺序连接在一起吗?结果是一个DataTable
?@Matt-是的,@Magnus-我不介意,@Pr0fess0rX-我已经包含了代码,我会把它更新为C#,我只是注意到另一个答案和它差不多。我将省略我的答案,因为它是vb.net,并且使用了方法语法(如问题中所示)。啊,我刚刚注意到另一个答案与它几乎相同。我将省略我的,因为它是vb.net,并且使用了方法语法(如问题中所述)。我使用的是这个(和/或@Bala R),但它没有引用数据列。什么是字符串。加入行动还是以某种方式隐式完成?@Simon Woods:很抱歉。我编辑了我的答案,加入了数据栏。太棒了。。。谢谢。这可能不是问题所在,但是,考虑到它的复杂性(imv),这有什么好处吗?比如说,按程序编写它,然后将它封装到函数中?@unomoni:我肯定有。我对VB.NET不太了解,但你可以看看这是否适合你:@SimonWoods:对不起,不知什么原因,我直到现在才注意到你的其他评论。没有什么可以阻止您将此查询本身或其各个部分包装到方法中,以便将其分解为更简单的块。但是,如果您尝试按程序编写此代码,您会发现代码要复杂得多:您将创建和填充字典和列表,到处运行for
循环和If
语句。这就是LINQ真正出色的用例。我正在使用这个(和/或@Bala R)s,但它没有引用数据列。什么是字符串。加入行动还是以某种方式隐式完成?@Simon Woods:很抱歉。我编辑了我的答案,加入了数据栏。太棒了。。。谢谢。这可能不是问题所在,但是,考虑到它的复杂性(imv),这有什么好处吗?比如说,按程序编写它,然后将它封装到函数中?@unomoni:我肯定有。我对VB.NET不太了解,但你可以看看这是否适合你:@SimonWoods:对不起,不知什么原因,我直到现在才注意到你的其他评论。没有什么可以阻止您将此查询本身或其各个部分包装到方法中,以便将其分解为更简单的块。但是,如果您尝试按程序编写此代码,您会发现代码要复杂得多:您将创建和填充字典和列表,到处运行for
循环和If
语句。这是LINQ真正闪耀的那种用例。