2011-01-07 109 views
1

我想基于它们的两个属性的值将我的自定义对象的数组分成几个数组。该结构是这样的:基于属性的单独对象组

struct MyStruct { 

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

现在,如果我有几个对象的数组:

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

我希望能够把它们放在一个阵列的每个人,列出所有对于那个人的命令:

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

我希望我已经说清楚了。我会认为有一个优雅的方式来与LINQ做到这一点,但我不知道从哪里开始。

+0

看看[这个问题](http://stackoverflow.com/questions/46130/how-do-i-group-in -memory-lists) - 你在找什么? – Aaron 2011-01-07 23:54:41

回答

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