我试图压缩列表列表,同时确保最终对象列表的类型正确。这是一个(抽象)例子:
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对象?
答案 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}}