如何输入选择多个结果

时间:2014-04-09 14:09:52

标签: c# linq

我试图压缩列表列表,同时确保最终对象列表的类型正确。这是一个(抽象)例子:

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对象?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

  

如何让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();

{{1}}