使用Linq对字符串进行分组,排序和连接

时间:2011-06-14 14:17:39

标签: vb.net linq

假设我有以下数据

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))

由于

西蒙

4 个答案:

答案 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 )