如何键入SelectMany结果

本文关键字:结果 SelectMany 何键入 | 更新日期: 2023-09-27 17:57:45

我正在尝试展平列表列表,同时确保最终对象列表的类型正确。下面是一个(抽象)示例:

class Space
{
    public List<Space> ContainedSpaces
    {
        get;
        set;
    }
}
class Library : Space
{
    public void AddRoom(Room room)
    {
        ContainedSpaces.Add(room);
    }
}
class Room : Space
{
}
class Test
{
    public List<Room> ListOfRooms(List<Library> libraries)
    {
         return libraries.SelectMany(lib => lib.ContainedSpaces).ToList();
    }
}

在这个例子中,我在ListOfRooms中的错误是:

Cannot implicitly convert type 'System.Collections.Generic.List<SoftTech.Integration.Space>' to 'System.Collections.Generic.List<SoftTech.Integration.Room>'

在不争论类设计(这是一个抽象的例子)的情况下,我如何让SelectMany将最终列表中的每个项目键入Room对象?

如何键入SelectMany结果

return libraries.SelectMany(lib => lib.ContainedSpaces).OfType<Room>().ToList();

如何让SelectMany将最终列表中的每个项目键入Room对象

好吧,你不能安全地铸造,因为不是每个Space都是Room从技术上讲Library可以包含其他类型的Space(即使您只定义了两个)。

在你的设计中,这将是完全合法的:

Library l = new Library();
l.ContainedSpaces = new List<Space>();
l.ContainedSpaces.Add(new Library());

您可以尝试使用进行投射

libraries.SelectMany(lib => lib.ContainedSpaces).Cast<Room>().ToList();

但是如果某些Space不是Room,那么您将得到一个InvalidCastException

或者,如果您只想房间的空间,那么您可以使用前面建议的OfType

libraries.SelectMany(lib => lib.ContainedSpaces).OfType<Room>().ToList();