首页 > 解决方案 > 从对象列表,如何获取特定对象参数值的列表基于另一个参数值

问题描述

不确定我做错了什么。我一直在网上寻找如何使用 lambda 有效地获取基于另一个属性的属性值列表。

假设我有一个包含教师姓名和房间 ID 的教室列表:

public class ClassRoom
{
    public string Teacher;
    public int RoomId;

}

List<ClassRoom> classRooms = new List<ClassRoom>();

classRooms.Add(new ClassRoom() { RoomId = 2000, Teacher = "Mr. Taylor" });
classRooms.Add(new ClassRoom() { RoomId = 2010, Teacher = "Mrs. Lee" });
classRooms.Add(new ClassRoom() { RoomId = 3050, Teacher = "Mrs. McNamara" });
classRooms.Add(new ClassRoom() { RoomId = 4090, Teacher = "Mr. Taylor" });

然后,我需要一个特定老师的房间 ID 列表。

List<int> RoomIds = new List<int>();

    foreach(ClassRoom classRoom in classRooms)
    {
        if(classRoom.Teacher == "Mr.Taylor")
        {
            RoomIds.Add(classRoom.RoomId);
        }
    }

我正在使用 lambda 表达式或任何其他有效且紧凑的方式来获取房间 ID 列表。我总是最终得到一个主类(ClassRoom)的列表。

我追求的是这样的:

List<int> RoomIds = classRooms.Where(x => x.Teacher == "Mr.Taylor").ToList();

我知道上面的表达式是错误的,因为操作给了我一个 ClassRoom 列表,而不是我需要的 RoomIds。我只是想描绘我所追求的。

这甚至可能吗?我非常感谢您的帮助。

标签: c#listlinqlambda

解决方案


你错过了一个Select

List<int> RoomIds = classRooms
    .Where(x => x.Teacher == "Mr.Taylor")
    .Select(x => x.RoomId)
    .ToList();

如果两个老师可能有相同的RoomId,并且您想要一个唯一的房间 ID 列表,您可以包括.Distinct()

List<int> RoomIds = classRooms
    .Where(x => x.Teacher == "Mr.Taylor")
    .Select(x => x.RoomId)
    .Distinct()
    .ToList();

推荐阅读