2014-03-06 92 views
0
List<object> Students = new List<object>() { 
    new { Name = "A", Age = 28, Height = 175 }, 
    new { Name = "B", Age = 29, Height = 176 }, 
    new { Name = "C", Age = 30, Height = 177 }, 
    new { Name = "D", Age = 31, Height = 178 }, 
    new { Name = "A", Age = 32, Height = 179 }, 
    new { Name = "E", Age = 33, Height = 180 }, 
    new { Name = "A", Age = 34, Height = 181 }, 
    new { Name = "F", Age = 35, Height = 182 }, 
    new { Name = "B", Age = 36, Height = 183 } 
}; 

1)如何按Age分组上述列表?使用linq和lambda对匿名类型对象进行分组

我试过类似var test = Students.GroupBy(x=> x.Age);,但它没有奏效。

2)我想创建一个名称为Key,高度为Value的字典。我怎样才能做到这一点?

回答

2

由于对象没有Age属性,因此您使用直线对象的方法无法工作。使用Name,Age和Height属性的预定义类更好。这将是更具可读性和类型安全的...

class Student 
{ 
    public string Name {get; set;} 
    public int Age {get; set;} 
    public int Height {get; set;} 

    public Student() {} //you would need parameterless constructor to use "new Student {...}" 
    public Student(string name, int age, int height) 
    { 
     Name = name; 
     Age = age; 
     Height = height; 
    } 
} 
var Students = new List<Student>() 
        { 
         new Student { Name = "A", Age = 29, Height = 175 }, //using initializer 
         new Student("B", 30, 176), //using constructor 
         ... 
        }; 

但如果这是不可能的 - 你可以随时使用dynamic。就像这样:

List<dynamic> Students = new List<dynamic>() 
          { 
           new { Name = "A", Age = 28, Height = 175 }, 
           ... 
          }; 
var test = Students.GroupBy(x=> x.Age); 

和词典 - 用ToDictionary

var test = Students.ToDictionary(x=> x.Name, x => x.Height); 

但是你可能想尝试ToLookup因为你在你的名字:)

+0

为了将Student对象添加到列表中,我们再次使用'new Student {Name =“A”,Age = 28,Height = 175}'? – burhan

+0

是的。或者,如果你想要,你可以添加该类的构造函数。 – JleruOHeP

+0

,构造函数的例子? – burhan

1

你可以做以下的有重复:

var Students = new []{ 
    new { Name = "A", Age = 28, Height = 175 }, 
    new { Name = "B", Age = 29, Height = 176 }, 
    new { Name = "C", Age = 30, Height = 177 }, 
    new { Name = "D", Age = 31, Height = 178 }, 
    new { Name = "A", Age = 32, Height = 179 }, 
    new { Name = "E", Age = 33, Height = 180 }, 
    new { Name = "A", Age = 34, Height = 181 }, 
    new { Name = "F", Age = 35, Height = 182 }, 
    new { Name = "B", Age = 36, Height = 183 } 
}.ToList(); 

var groupedStudents = Students.GroupBy(x=>x.Age); 

主要区别在于我创建一个匿名列表(我实际上并不需要.ToList(),但我向你展示了如果你想用其他任何列表工具)。这样做的好处是ToList是一个通用的方法,可以从它正在处理的枚举中推断出类型是什么,在这种情况下,它是匿名类型的枚举类型。

当然很多时候你可能会更好的创建一个Student对象而不是使用匿名对象。

至于创建一个名称为键和高度值的字典 - 你不能。字典需要有唯一的密钥,并且您在此处有多个具有相同名称的项目,因此试图执行ToDictionary()它不起作用。

你可以尝试使用ToLookup(),这将获得匹配值的枚举键(类似于group by,但更容易查找)。