2010-10-12 68 views
1

帮助我有一个样本类是这样的:需要使用LINQ

SampleClass 
{ 
    string code; 
    int id; 
    string name;  
} 

该类有效数据将是:

SampleClass{code= "code1", id= 1, name= "name1"} 
SampleClass{code= "code1", id= 1, name= "name2"} 
SampleClass{code= "code2", id= 2, name= "name1"} 
SampleClass{code= "code2", id= 2, name= "name2"} 
SampleClass{code= "code2", id= 2, name= "name3"} 

现在的问题是,通过使用LINQ,我需要创建在SampleClass“id”字段上分组的TestClass集合。

TestClass的结构如下:

TestClass 
{ 
    string code;   
    List<string> names;  
} 

,其中 “名” 是 “ID” 分组的所有SampleClass “名称” 值的列表。

基于上述SampleClass样本数据,我将具有2个的TestClass对象,一个用于ID = 1和其他为ID = 2

预先感谢

回答

3

OK,如果你有SampleClasses的IEnumerable称为classes,试试这个:

 var testClasses = classes 
      .GroupBy(c => c.id) 
      .Select(grp => new TestClass 
      { 
       code = grp.First().code, 
       names = grp.Select(c => c.name).ToList() 
      }); 
+0

删除我的答案 - 这一个实际上没有名称的列表,而不是SampleClasses作为'names'值的列表。 – 2010-10-12 04:35:29

+0

事实上,这个答案是比我好,因为我已经混了链枚举的扩展和类似SQL的语法。 +1 ;-) – zerkms 2010-10-12 04:41:10

+0

@zerkms:为什么谢谢主席先生/鞠躬 – 2010-10-12 04:44:01

3
var result = from c in collection 
      group c by c.id into g 
      select new TestClass { 
             code = g.First().code, 
             names = g.Select(i => i.name).ToList() 
            }; 

PS:我没有VS近了,我希望我没有做了很多错误的有:-)

+0

这将意味着TestClass.code是SampleClass.id,而不是SampleClass.code。 – 2010-10-12 04:32:35

+0

这几乎工程,除TestClass.names需要一个列表/枚举SampleClass的不是字符串这个工作列表。 – 2010-10-12 04:33:01

+0

@Alastair皮茨:是的,感谢校正 – zerkms 2010-10-12 04:34:33

2

MSDN有一些伟大的LINQ的例子,包括使用分组,只是你需要什么做的。你可以找到一个与你想要的东西类似的例子here