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真正闪耀的那种用例。