我有一個arraylist可以包含3種類型(switch1,switch2,switch3)中的一種。我如何將其轉換爲列表?轉換不同類型的ArrayList
var switches = _switch.Switches;
var newList = switches.Cast<SwitchObj>().ToList();
這沒有奏效。下面是在每個交換機1,交換機2中,交換機3
string DeviceType
string Name
string[] State
我有一個arraylist可以包含3種類型(switch1,switch2,switch3)中的一種。我如何將其轉換爲列表?轉換不同類型的ArrayList
var switches = _switch.Switches;
var newList = switches.Cast<SwitchObj>().ToList();
這沒有奏效。下面是在每個交換機1,交換機2中,交換機3
string DeviceType
string Name
string[] State
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>();
請閱讀以上內容 – 2011-03-21 23:19:52
@rob morgan:更新了我的回覆。 – 2011-03-21 23:27:11
我在arraylist中沒有不同的類型,它們都是相同的類型。有時它們都是switch1,有時它們都是switch2。 – 2011-03-21 23:42:21
如果所有三種類型具有相同的基本類型,則可以進行強制轉換。如果你的類型是字符串,字符串和字符串[],那麼只能強制轉換爲List。
你想達到什麼目的?
這一定很複雜。我在arraylist中的類型由Switch1(字符串,字符串和字符串[])組成,我需要將它轉換爲List,或者ArrayList可以由Switch2(字符串,字符串和字符串[])組成。無論列表中的數據類型是什麼,我都需要將它們轉換爲SwitchObj(字符串,字符串和字符串[])。 – 2011-03-21 23:49:51
@rob摩根:我對此評論添加了另一個更新。 – 2011-03-21 23:56:23
@rob摩根:好的,我收回它;這只是討厭的。你確定'switch1','switch2'和'switch3'不都是從同一個基類繼承的嗎?看起來像一個相當差的設計IMO。 – 2011-03-21 23:59:40
而不是使用Cast
,您可以使用OfType
,它將返回一個匹配指定類型的項目序列。這相當於Cast
,但如果物品不符合,則不會丟棄。
在你的情況下,switches.OfType<SwitchObj>().ToList()
將是List<SwitchObj>
。 ArrayList
中的任何其他項目都將被忽略。
你必須使用什麼語言 – 2011-03-21 22:57:02
我正在使用CSharp – 2011-03-21 22:58:51
@all我想我沒有解釋得很好。我在arraylist中有對象。每個對象都有字符串,字符串和sting []。對象類型可以根據添加的內容而有所不同。所以我可以有一個2個Switch1對象的數組列表,或者它可以是3個switch2對象。我需要將其轉換爲名爲SwitchObj的單一類型的List。我無法改變陣列列表的創建方式。這有幫助嗎? –
2011-03-21 23:19:04