我有一个arraylist,可以包含3种类型中的一种(switch1,switch2,switch3)。如何将其转换为List?
var switches = _switch.Switches;
var newList = switches.Cast<SwitchObj>().ToList();
这不起作用。以下是switch1,switch2,switch3
中的每一个string DeviceType
string Name
string[] State
答案 0 :(得分:3)
ArrayList类型是仿制药前几天的遗留神器。您不再需要使用它(如果您真的想要),您只需创建List<object>
即可。当然,这不会解决您的问题,因为您试图将两个不同类型(string
和string[]
)转换为相同类型,这没有多大意义。
我的建议是只在集合中存储一种类型的对象。看起来你的类型都适合作为单个类的属性,所以......
class Device
{
public Device( string name, string type, string[] state = null )
{
Name = name;
DeviceType = type;
State = state;
}
public string Name { get; }
public string DeviceType { get; }
public string[] State { get; set; }
}
现在您只需要使用Device
个对象填充您的收藏集,并且所有投射问题都会消失。
List<Device> devices = new List<Device>();
devices.Add( new Device( "Device1", "SomeType" ) );
devices.Add( new Device( "Device2", "SomeType" ) );
devices.Add( new Device( "Device3", "SomeType" ) );
foreach( Device d in devices )
{
// do stuff with d.Name, d.State, and d.DeviceType
}
编辑以解决更新的问题:
这两种类型是兼容的还是不兼容,没有解决方法。既然它们不是,你可以修改类来实现单个接口吗?例如,如果两个类都实现了以下接口,则可以简单地维护List<IDevice>
集合并对其进行一般处理。所以,代码就变成了......
interface IDevice
{
string Name { get; }
string DeviceType { get; }
string[] State { get; set; }
}
class DeviceTypeOne : IDevice
{
// constructor omitted
public string Name { get; }
public string DeviceType { get; }
public string[] State { get; set; }
}
class DeviceTypeTwo : IDevice
{
// constructor omitted
public string Name { get; }
public string DeviceType { get; }
public string[] State { get; set; }
}
List<IDevice> devices = new List<IDevice>();
devices.Add( new DeviceTypeOne( "Device1", "SomeType" ) );
devices.Add( new DeviceTypeTwo( "Device2", "SomeType" ) );
foreach( IDevice d in devices )
{
// do stuff with d.Name, d.State, and d.DeviceType
// you now just deal with each object through the IDevice interface
}
如果您无法修改代码,那么您只需根据其类型单独处理它们。例如:
IEnumerable<SomeDeviceType> lsOne = arrayList.OfType<SomeDeviceType>();
IEnumerable<SomeOtherDeviceType> lsTwo = arrayList.OfType<SomeOtherDeviceType>();
答案 1 :(得分:0)
如果所有三种类型具有相同的基本类型,则可以进行转换。如果你的类型是字符串,字符串和字符串[],那么除了强制转换为List之外别无他法。
你想要达到什么目标?
答案 2 :(得分:0)
您可以使用Cast
而不是OfType
,它将返回与指定类型匹配的项目序列。它相当于Cast
但如果项目不符合则不会抛出。
在您的情况下,switches.OfType<SwitchObj>().ToList()
将是List<SwitchObj>
。 <{1}}中的任何其他项都将被忽略。