2011-03-21 43 views
1

我有一個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 
+0

你必須使用什麼語言 – 2011-03-21 22:57:02

+0

我正在使用CSharp – 2011-03-21 22:58:51

+0

@all我想我沒有解釋得很好。我在arraylist中有對象。每個對象都有字符串,字符串和sting []。對象類型可以根據添加的內容而有所不同。所以我可以有一個2個Switch1對象的數組列表,或者它可以是3個switch2對象。我需要將其轉換爲名爲SwitchObj的單一類型的List 。我無法改變陣列列表的創建方式。這有幫助嗎? – 2011-03-21 23:19:04

回答

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>(); 
+0

請閱讀以上內容 – 2011-03-21 23:19:52

+0

@rob morgan:更新了我的回覆。 – 2011-03-21 23:27:11

+0

我在arraylist中沒有不同的類型,它們都是相同的類型。有時它們都是switch1,有時它們都是switch2。 – 2011-03-21 23:42:21

0

如果所有三種類型具有相同的基本類型,則可以進行強制轉換。如果你的類型是字符串,字符串和字符串[],那麼只能強制轉換爲List。

你想達到什麼目的?

+0

這一定很複雜。我在arraylist中的類型由Switch1(字符串,字符串和字符串[])組成,我需要將它轉換爲List,或者ArrayList可以由Switch2(字符串,字符串和字符串[])組成。無論列表中的數據類型是什麼,我都需要將它們轉換爲SwitchObj(字符串,字符串和字符串[])。 – 2011-03-21 23:49:51

+0

@rob摩根:我對此評論添加了另一個更新。 – 2011-03-21 23:56:23

+0

@rob摩根:好的,我收回它;這只是討厭的。你確定'switch1','switch2'和'switch3'不都是從同一個基類繼承的嗎?看起來像一個相當差的設計IMO。 – 2011-03-21 23:59:40

0

而不是使用Cast,您可以使用OfType,它將返回一個匹配指定類型的項目序列。這相當於Cast,但如果物品不符合,則不會丟棄。

在你的情況下,switches.OfType<SwitchObj>().ToList()將是List<SwitchObj>ArrayList中的任何其他項目都將被忽略。

相關問題