我正在尝试展平列表列表,同时确保最终对象列表的类型正确。下面是一个(抽象)示例:
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对象?
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();