2013-07-28 148 views
2

我有一個接口(IAnimal),它由兩個類Bear和Goat實現。如何將List <Bear>或List <Goat>分配到列表<IAnimal>

在運行時,我可能最終會與熊,或山羊的名單,但無論是他們需要被分配到財產IEnumerable<IAnimal>

這工作,爲IEnumerable共同變種。

不過,我現在需要從IEnumerable<IAnimal>這當然行不通刪除項目。

什麼我需要做的,能夠刪除的項目?

這裏是工作示例:

interface IAnimal {} 
public class Bear : IAnimal {} 
public class Goat : IAnimal {} 

class Program 
{ 
    public static IEnumerable<IAnimal> CouldBeBearsOrGoats { get; set; } 
    static void Main(string[] args) { 

     var list = new List<int>() {1, 2, 3}; 

     var bears = from l in list select new Bear(); 

     var goats = from l in list select new Goat(); 

     CouldBeBearsOrGoats = bears; 

     CouldBeBearsOrGoats = goats; 

     //How do I now remove an item? 


    } 
} 

如果我改變CouldBeBearsOrGoats到列表,然後我就可以刪除項目,但我不能再分配任一類型。

public static List<IAnimal> CouldBeBearsOrGoats { get; set; } 

該列表將會很長,所以我不想僅複製列表並使用副本。我正在做的是處理列表中的每個項目,然後刪除它,直到列表爲空。

+0

@TimSchmelter,一個'列表'不是'ICollection的',所以它不會解決任何問題 –

+0

通過提供'名單',你允許用戶在山羊添加到熊的列表,這可能在您的系統中無效。如果你只想允許刪除,也許你應該提供類似'IEnumerable Animals {get {return _animals.AsReadOnly(); }}'和'void RemoveAnimal(IAnimal animal){_animals.Remove(animal); }'。 – nmclean

回答

5

由於您的源數據無論如何都是IEnumerable,您必須將其轉換爲List以添加/移除元素。

List<IAnimal> ListOfAnimals1 = bears.Cast<IAnimal>().ToList(); 
    List<IAnimal> ListOfAnimals2 = goats.Cast<IAnimal>().ToList(); 
+0

不知道爲什麼這是downvoted;這實際上是一個好的解決方案。 –

+0

這適用於我。 –

0

我不認爲有一個簡單的方法來做到只使用強類型集合,由於沒有協變採集接口,暴露了一個Remove方法...

我看到2個可能的解決方案:

  • 使用非通用ICollection接口,由List<T>實現:

    var collection = (ICollection) CouldBeBearsOrGoats; 
    collection.Remove(whatever); 
    

    的缺點是實現ICollection<T>集合可能不實現ICollection ...

  • 使用動態:

    dynamic collection = CouldBeBearsOrGoats 
    collection.Remove(whatever); 
    

    但它可能比以前的方法要慢。


假設你不想鑄造項目變更的實際類型的收藏品到IAnimal

2

一個posibility是在你的LINQ查詢添加Cast調用,因此它轉換IEnumerable<Goat>IEnumerable<IAnimal>(這實際上創建了澆鑄每個元件一個新的迭代)。

var bears = (from l in list select new Bear()).Cast<IAnimal>().ToList(); 

var goats = (from l in list select new Goat()).Cast<IAnimal>().ToList(); 

現在無論bearsgoatsIAnimal枚舉接口,你可以對它們進行操作。

相關問題