0

私は次のようにクラスFooを持っています。

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

私はこのクラスのコレクションを持っています。たとえばListとすると、コレクションに次のようなデータがある場合があります。

名前の値   
ジミーこんにちは   
ジミーワールド   
ピーターどうやって  
ピーターはあなたですか?   
スザンヌ元気です

以下と同じ名前の値フィールドを組み合わせたい

名前の値  
ジミーハローワールド  
ピーターお元気ですか?  
スザンヌ元気です  

とにかく、これはLinqを使用して達成できますか?

4

3 に答える 3

7

LinqGroupByは次のように使用できます。

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();
于 2012-09-07T16:55:36.510 に答える
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の質問を参照してください:Linq(C#)を使用してすべての連続したオブジェクトを分離する方法

于 2012-09-07T17:18:59.250 に答える
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()
               };
于 2012-09-07T16:57:43.820 に答える