[英]Group a list of anonymous type objects using linq and lambda
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)如何按年龄分组以上列表?
我尝试了类似var test = Students.GroupBy(x=> x.Age);
,但无效。
2)我想创建一个字典,名称为Key
,高度为Value
。 我怎样才能做到这一点?
您使用直线对象的方法将不起作用,因为对象没有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
因为您的名称中有重复项:)
您可以执行以下操作:
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()
但向您展示了如何使用该列表处理其他List东西)。 这样做的好处是ToList
是一种通用方法,可以从其可枚举中推断出该类型是什么,在这种情况下,该枚举是匿名类型的可枚举。
当然,很多时候,最好只创建一个Student
对象,而不是使用匿名对象。
至于创建名称为键,高度为值的字典-您不能。 字典需要具有唯一的键,并且此处有多个具有相同名称的项,因此尝试执行ToDictionary()
不会起作用。
您可以尝试使用ToLookup()
,该键将获取可枚举的匹配值的键(类似于group by,但更易于查找)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.