2011-01-07 11 views
1

カスタムオブジェクトの配列を2つのプロパティの値に基づいて複数の配列に分割したいとします。オブジェクトのグループをプロパティに基づいて区切ります

{Person1, cmd1} 
{Person1, cmd3} 
{Person2, cmd3} 
{Person3, cmd2} 
{Person2, cmd4} 

私がすべて一覧表示されますそれぞれの人のための1つの配列、にそれらを配置することができるようにしたい:私はいくつかのオブジェクトの配列を持っている場合は、今すぐ

struct MyStruct { 

    public string Person { 
     get; 
     set; 
    } 
    public string Command { 
     get; 
     set; 
    } 
} 

:構造体は次のようになりますその人のためのコマンドの:

{Person1: cmd1, cmd3} 
{Person2: cmd3, cmd4} 
{Person3: cmd2} 

私は私の記述で明確にしたいと思う。私はLINQでこれを行うエレガントな方法があると思いますが、どこから始めたらいいか分かりません。

+0

[この質問](http://stackoverflow.com/questions/46130/how-do-i-group-inを見てみましょう-memory-lists) - それはあなたが探しているものですか? – Aaron

+0

変更可能な構造体を作成しないでください。 http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil – Ani

+0

@aniのみの問題私はここで、set-propertiesはpublicであるが、groupingでは元のものは何も変更されないstructs!? –

答えて

2
IEnumerable<MyStruct> sequence = ... 

var query = sequence.GroupBy(s => s.Person) 
        .Select(g => new 
           { 
            Person = g.Key, 
            Commands = g.Select(s => s.Command).ToArray() 
           }) 
        .ToArray(); 

クエリ構文で同様のクエリ:

var query = from s in sequence 
      group s.Command by s.Person into g 
      select new { Person = g.Key, Commands = g.ToArray() }; 

var queryArray = query.ToArray(); 

あなたは、配列の配列を求めたが、ここで結果は匿名型の配列で、そのメンバーの一人であることに注意してください。文字列の配列


また、通常はnot recommended to create mutable structsです。

0

私はこれにそれを行う最も簡単な方法を見つける:

yourCollection.ToLookup(i => i.Person);