繁体   English   中英

使用linq和lambda将匿名类型对象的列表分组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM