2012-05-23 36 views
1

我有一個靜態列表:收藏列表有多種類型的用戶定義對象?

public static List<IMachines>mList =new List<IMachines>(); 

名單攝入量是兩個不同類型的對象(機)的:

IMachines machine = new AC(); 
IMachines machine = new Generator(); 

如果將項目添加到列表之後,我想搜索特定的機器通過其名稱屬性,然後在使用foreach循環遍歷後,如果該項目在列表中找到...我應該知道該項目是AC類型還是Generator類型?

+8

「我怎麼知道,如果該項目是AC型或發電機型的?」你不是。通過「IMachines」接口來引用對象,你只是說只有那個接口指定的東西纔是你關心的東西。有辦法解決它,但正確的答案通常是解決設計問題,需要你做到這一點。 – Telastyn

+1

有不同的方法來做到這一點。 ''''作爲'運營商,也是我的答案中所描述的。但Telastyn就在這裏。您應該修復設計問題並將所需的一切通過界面公開。 –

+0

我應該使用類引用變量而不是接口? ... –

回答

2

使用「is」運算符。

List<IMachines> list = new List<IMachines>(); 
list.Add(new AC()); 
list.Add(new Generator()); 
foreach(IMachines o in list) 
{ 
    if (o is Ingredient) 
    { 
    //do sth 
    } 
    else if (o is Drink) 
    { 
    //do sth 
    } 
} 
5

可以使用is operator

檢查如果一個對象是與給定類型

例如兼容:

if(item is AC) 
{ 
    // it is AC 
} 
+2

請注意,如果您隨後想將'item'視爲'AC',那麼您可以使用'as'運算符並檢查null,在此時您可以使用鍵入的'AC'。 –

1

也可以使用OfType()方法僅返回指定類型的物品:

IEnumerable<Generator> generators = mList.OfType<Generator>(); 
3
interface IVehicle { 

    } 

    class Car : IVehicle 
    { 

    } 

    class Bicycle : IVehicle 
    { 

    } 

    static void Main(string[] args) 
    { 
     var v1 = new Car(); 
     var v2 = new Bicycle(); 

     var list = new List<IVehicle>(); 
     list.Add(v1); 
     list.Add(v2); 

     foreach (var v in list) 
     { 
      Console.WriteLine(v.GetType()); 
     } 

    } 
0

使用isas運算符。

 List<IMachines> mList =new List<IMachines>(); 
     IMachines machine = mList.Where(x => x.Name == "MachineName").FirstOrDefault(); 

     if (machine != null) 
     { 
      if (machine is Generator) 
      { 
       Generator generator = machine as Generator; 
       //do something with generator 
      } 
      else if (machine is AC) 
      { 
       AC ac = machine as AC; 
       //do something with ac 
      } 
      else 
      { 
       //do you other kinds? if no, this is never going to happen 
       throw new Exception("Unsupported machine type!!!"); 
      } 

     } 
+0

作爲與is組合使用的操作符是沒有意義的。如果您決定使用'is',則直接轉換爲匹配類型不會拋出異常。 這裏最好的解決方案是使用'as'運算符並檢查null。 –

+0

如果機器是Generator,機器**不能爲null,因爲null對象沒有類型。所以周圍的「if」已經過時了。 – fero

+0

@MichalB。我只是同意。此代碼僅供說明。 – Mzn

0

如果您想根據類型做不同的操作,您可以使用GroupBytype

通過這樣做,您可以獲得對應於每個派生類型的子列表。

以下是代碼片段

void Main() 
    { 
     List<IMachines> mList = new List<IMachines>(); 

     mList.Add(new AC()); 
     mList.Add(new Generator()); 
     mList.Add(new AC()); 
     mList.Add(new Generator()); 
     mList.Add(new Generator()); 
     mList.Add(new Generator()); 

     var differentIMachines = mList.GroupBy(t=>t.GetType()); 
     foreach(var grouping in differentIMachines) 
     { 
       Console.WriteLine("Type - {0}, Count - {1}", grouping.Key, grouping.Count()); 

       foreach(var item in grouping) 
       { 
       //iterate each item for particular type here 
       } 
     } 

    } 

    interface IMachines { } 

    class AC : IMachines {} 

    class Generator : IMachines {} 
相關問題