转换不同类型的arraylist

时间:2011-03-21 22:52:26

标签: c# arraylist

我有一个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

3 个答案:

答案 0 :(得分:3)

ArrayList类型是仿制药前几天的遗留神器。您不再需要使用它(如果您真的想要),您只需创建List<object>即可。当然,这不会解决您的问题,因为您试图将两个不同类型(stringstring[])转换为相同类型,这没有多大意义。

我的建议是只在集合中存储一种类型的对象。看起来你的类型都适合作为单个类的属性,所以......

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}}中的任何其他项都将被忽略。