2012-09-07 25 views
0

我有一个类Foo如下。如何使用Linq得到这个分组结果

public class Foo 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
} 

我有这个类的集合让我们说列表,有时我有数据收集如下。

 
Name   Value 
Jimmy   hello 
Jimmy   World 
Peter   how 
Peter   are you? 
Suzanne   I am fine 

我希望值字段结合起来,同名folows

 
Name   Value 
Jimmy   hello World 
Peter   how are you? 
Suzanne   I am fine 

反正这可以使用LINQ来完成?

+0

为什么要投票? –

回答

7

您可以使用LINQ的GroupBy如下:

fooCollection.GroupBy(foo => foo.Name) 

    // create a new "Foo" object based on each grouping 
    .Select(g => new Foo() { 

     // "Name" becomes the group key (ie, "Jimmy", "Peter", etc) 
     Name = g.Key, 

     // "Value" becomes the Value for all Foo in this group, concatenated 
     Value = string.Join(" ", g.Select(item => item.Value).ToArray()) 
    }) 
    .ToArray(); 
+0

获取以下错误:'string.Join(string,string [])'的最佳重载方法匹配有一些无效参数。参数2:无法从'System.Collections.Generic.IEnumerable '转换为'string []' –

+0

@palmsnow现在应该被改正 - 我在'g.Select(item => item)后面加了'.ToArray()' .value的)' – McGarnagle

0
from a in myList 
group a by a.Name 
into g 
select new Foo { 
       Name = g.Key.Name, 
       Value = string.Join(" ",g.Select(x=>x.Value).ToArray() 
       }; 
1

这在我看来就像某种聊天功能。所有其他答案都适合常规使用,并且适用于您提供的样例,但我相信您需要进行连续分组。

比方说,你拥有的数据是这样的:

Name Value 
Jimmy hello 
Jimmy world 
Peter how 
Peter are you? 
Suzanne I am fine 
Jimmy OK, bye 

注意在底部的另一吉米值。如果你只使用正如其他人所建议的规则分组,结果将是:

Name Value 
Jimmy hello world OK, bye 
Peter how are you? 
Suzanne I am fine 

你可能会想这样的事情,而不是:

Name Value 
Jimmy hello world 
Peter how are you? 
Suzanne I am fine 
Jimmy OK, bye 

在的想法这太问题看看关于如何做连续分组:How to separate all consecutive Objects using Linq (C#)