如何使用Linq获得此分组结果

时间:2012-09-07 16:52:37

标签: c# linq

我有一个Foo类如下。

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

我有一个这个类的集合让我们说List,有时我在集合中有如下数据。

 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完成吗?

3 个答案:

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

答案 1 :(得分: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

请查看此SO问题,了解如何进行连续分组:How to separate all consecutive Objects using Linq (C#)

答案 2 :(得分: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()
               };