2012-09-27 95 views
31

我似乎在围绕C#泛型列表的通用列表这个想法时遇到了一些麻烦。我认为这个问题源于使用<T>的论点,我之前没有经验过。有人可以提供一个声明一个List的类的简短例子,其中包含另一个List,但其中包含的对象的类型不是立即知道的吗?在C#中创建列表的列表

我一直在阅读有关泛型的MS文档,我不能立即确定我是否可以声明List<List<T>>,也不知道如何将<T>参数传递给内部列表。

编辑:添加信息

将宣告List<List<T>>这里视为合法?如果你想知道,我正在建立一个类,允许我使用ulong作为索引器,并且(希望)通过维护列表清单来绕过.Net的令人讨厌的2GB限制。

public class DynamicList64<T> 
    { 
     private List<List<T>> data = new List<List<T>>(); 

     private ulong capacity = 0; 
     private const int maxnumberofitemsperlist = Int32.MaxValue; 



     public DynamicList64() 
     { 
      data = new List<List<T>>(); 
     } 

回答

50

一个简单的例子:

List<List<string>> myList = new List<List<string>>(); 
myList.Add(new List<string> { "a", "b" }); 
myList.Add(new List<string> { "c", "d", "e" }); 
myList.Add(new List<string> { "qwerty", "asdf", "zxcv" }); 
myList.Add(new List<string> { "a", "b" }); 

// To iterate over it. 
foreach (List<string> subList in myList) 
{ 
    foreach (string item in subList) 
    { 
     Console.WriteLine(item); 
    } 
} 

是不是你想要的?或者你是否试图创建一个新的class,它扩展了List<T>,该成员是`List'?

+2

重读问题:) –

17

或者这个例子,只是为了让它更加明显:

public class CustomerListList : List<CustomerList> { } 

public class CustomerList : List<Customer> { } 

public class Customer 
{ 
    public int ID { get; set; } 
    public string SomethingWithText { get; set; } 
} 

,你可以保持下去。前无古人后无来者 !

+2

+1。好主意。您甚至可以将客户特定的东西添加到它中,例如以客户名称作为参数的“添加”方法,该方法自动创建并添加客户。 (你需要一个'where T:new()'约束)。 –

+1

你可以只使用别名代替,因为类的身体都是空 – Servy

+0

@Servy,一升上来,我改变了后,使其尽可能谁认为这是明显的,TKS – RollRoll

2
public class ListOfLists<T> : List<List<T>> 
{ 
} 


var myList = new ListOfLists<string>(); 
1

我一直在玩这个想法,但我试图实现一个稍微不同的行为。我的想法是创建一个继承自己的列表,从而创建一个数据结构,从本质上讲,您可以将列表内嵌入列表内的列表......无限!

实施

//InfiniteList<T> is a list of itself... 
public class InfiniteList<T> : List<InfiniteList<T>> 
{ 
    //This is necessary to allow your lists to store values (of type T). 
    public T Value { set; get; } 
} 

T是一般类型参数。它确保您班级的安全。在创建InfiniteList的实例时,将T替换为希望列表填充的类型,或者在此实例中使用Value属性的类型。

//The InfiniteList.Value property will be of type string 
InfiniteList<string> list = new InfiniteList<string>(); 

“工作” 的例子此,其中T是在本身,字符串类型的列表!

//Create an instance of InfiniteList where T is List<string> 
InfiniteList<List<string>> list = new InfiniteList<List<string>>(); 

//Add a new instance of InfiniteList<List<string>> to "list" instance. 
list.Add(new InfiniteList<List<string>>()); 

//access the first element of "list". Access the Value property, and add a new string to it. 
list[0].Value.Add("Hello World"); 
0

你不应该在列表中使用嵌套列表。

List<List<T>> 

即使T是定义类型也不合法。

https://msdn.microsoft.com/en-us/library/ms182144.aspx

+1

你是什么意思,这不合法?当然如此。你链接到的只是一个设计警告。最好避免使用这种语法,特别是在公共API中,但是有一些有效的用例用于执行此类操作。 –