60

我似乎很难理解 C# 中通用列表的通用列表的想法。我认为问题源于对<T>论点的使用,我以前没有玩过这个论点。有人可以提供一个简短的例子来声明一个类是一个列表,其中包含另一个列表,但其中包含的对象的类型不是立即知道的吗?

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

编辑:添加信息

在这里宣布一个List<List<T>>被认为是合法的吗?如果您想知道,我正在构建一个允许我使用 aulong作为索引器的类,并且(希望)通过维护一个列表来绕过 .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>>();
        } 
4

7 回答 7

108

一个简单的例子:

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>成员,该成员具有“列表”成员?

于 2012-09-27T18:55:41.443 回答
29

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

public class CustomerListList : List<CustomerList> { }  

public class CustomerList : List<Customer> { }

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

你可以继续下去。前无古人后无来者 !

于 2012-09-27T18:57:02.513 回答
2
public class ListOfLists<T> : List<List<T>>
{
}


var myList = new ListOfLists<string>();
于 2012-09-27T19:01:58.517 回答
2

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

执行

//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");
于 2012-09-27T22:47:03.693 回答
0

看一个直接的例子:

public partial class Form1 : Form
{
    List<List<Label>> txtList;
    List<List<int>> num;
    public Form1()
    {
        InitializeComponent();
        txtList = new List< List<Label> >() { 
            new List<Label> { label1, label2, label3 }, 
            new List<Label> { label4, label5, label6 }, 
            new List<Label> { label7, label8, label9 } 
        };

        num = new List<List<int>>() { new List<int>() { 1, 2 }, new List<int>() { 3, 4 } };
    }
}
于 2021-12-06T15:26:33.677 回答
0

我有以下代码

  public class ChildClass
    {
        public string FieldName { get; set; }
        public string Value { get; set; }
        public string StatusClass { get; set; }
        public string StatusMessage { get; set; }
    }

创建list obj的列表如下

List<List<ChildClass>> obj = new List<List<ChildClass>>();
于 2021-10-29T14:56:15.883 回答
-4

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

List<List<T>> 

是不合法的,即使 T 是已定义的类型。

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

于 2015-02-25T16:33:07.993 回答