2014-09-22 198 views
0

我有一堆實現接口I的對象列表。我想製作這些列表的列表,並將它們作爲單個對象進行處理。我試過製作一個List<List<I>>並添加了我的其他列表,因爲我添加的列表包含的對象實現了I,但編譯器不讓我這樣做。爲什麼我不能將列表<T:界面>添加到列表<列表<Interface>>?

例子:

public interface I 
{ 
//stuff 
} 

public class A : I 
{ 
//... 
} 
public class B : I 
{ 
//... 
} 

//elsewhere 
public class C 
{ 
    List<A> ListOfA; 
    List<B> ListOfB; 
    List<List<I>> ListOfLists; 
    public C() 
    { 
     ListOfA = new List<A>(); 
     ListOfB = new List<B>(); 
     ListOfLists = new List<List<I>>(); 
     ListOfLists.Add(ListOfA); //nope 
     ListOfLists.Add(ListOfB); //nope 
    } 
} 

我有兩個問題,第一個是這是爲什麼不允許的行爲?第二個是我如何才能完成我期待的目標?

澄清,當我嘗試將列表添加到ListOfLists我得到「無法從列表轉換爲列表」,其中T : I。我正在使用.NET 3.5,不,我不能升級到更高版本。

+0

這是關於方差和詭計,你想要什麼是不可能的,在你途中 – Alireza 2014-09-22 13:34:06

+0

還涉及:「在C#中,爲什麼不能一名單對象存儲在一個列表變量」(HTTP ://stackoverflow.com/questions/6557/in-c-why-cant-a-liststring-object-be-stored-in-a-listobject-variable)。 – Groo 2014-09-22 13:39:58

回答

1

如果你能,你就可以這樣寫:

List<I> listOfAs = ListOfLists[0]; 

var B = new B(); 
listOfAs.Add(B); 

這顯然是禁止的,你可以不是B實例添加到A的列表

This answer通過埃裏克利珀提供了良好的與動物而不是As和Bs相似的例子。

要回答你的第二個問題,我們需要做你打算用ListOfLists做的事情,只需在初始化後枚舉或修改集合即可。

如果這個想法僅僅是有我實例的只讀集合:

IEnumerable<I> collectionOfIs = ListOfA.Cast<I>().Concat(ListOfB.Cast<I>()); 

這工作,因爲名單實現IEnumerable

然後你可以使用ToList兌現的收集和能夠使用一個索引:

List<I> listOfIs = collectionOfIs.ToList(); 
+0

好點,但是如果我想只讀,包含所有其他列表的元素的連接列表呢? – Logan 2014-09-22 13:27:51

+3

@Logan:然後你想要的類型是IEnumerable ',而不是'List '。啊哈! – 2014-09-22 13:29:27

+0

啊!我錯過了'Concat'方法。讓我快點嘗試一下。 – Logan 2014-09-22 13:31:36

0

您需要使用IEnumerable<I>因爲List<I>是一個集合對象

List<A> ListOfA; 
    List<B> ListOfB; 
    List<IEnumerable<I>> ListOfLists; 
    public C() 
    { 
     ListOfA = new List<A>(); 
     ListOfB = new List<B>(); 
     ListOfLists = new List<IEnumerable<I>>(); 
     ListOfLists.Add(ListOfA); 
     ListOfLists.Add(ListOfB); 
    } 
+0

試過這個,不起作用。同樣的問題,不能從列表轉換爲IEnumberable Logan 2014-09-22 13:28:21

+0

@logan老兄我也試過這個:|,發佈您的嘗試 – Sam 2014-09-22 13:28:45

+1

@Logan:這應該在.NET 4.5和更新的版本中工作,因爲IEnumerable 的泛型類型參數[covariant](http://msdn.microsoft.com/en-us/library/dd799517(v = vs.110).aspx)(即添加'out'關鍵字:'IEnumerable ')。 – Groo 2014-09-22 13:30:54