如何声明一个对象,该对象是泛型类型的列表

时间:2015-09-24 20:57:58

标签: c# list generics nested-lists

是否可以声明一个对象是 列表的泛型类型。 所以有点像private List<List<T>> outerList = new List<List<T>>();但是实际编译的声明。

想要使用这样的动态:private List<List<dynamic>> list2 = new List<List<dynamic>>();,因为我想输入安全性。

我有点喜欢:

foreach(List<T> innerList in outerList)
{
    foreach(T item in innerList)
    {
        doSomethingTo(item);
    }
}

理想情况下,我想声明一个继承自List<List<T>>

的类

修改

我可能应该更清楚。内部列表必须能够具有不同的类型。因此,一个内部列表可能是List<string>,另一个List<int>

进一步编辑

根据 @ErikE 的请求,问题已经改写为here

3 个答案:

答案 0 :(得分:3)

当然,您可以将其定义为通用类:

public class Foo<T> : List<List<T>>
{

}

然后有一个处理其中一个的通用方法:

public void Process<T>(Foo<T> outerList)
{
    foreach(List<T> innerList in outerList)
    {
        foreach(T item in innerList)
        {
            doSomethingTo(item);
        }
    }
}

当然doSomethingTo也需要是通用的。

  

我可能应该更清楚。内部列表必须能够具有不同的类型。因此,一个内部列表可能是List<string>,另一个List<int>

是的,你应该更清楚。 List<string>List<int>之间没有继承关系,允许您将它们存储在单个类型安全的外部集合中。您必须求助于List<object>List<dynamic>,或找到符合您需求的其他数据结构。

答案 1 :(得分:2)

您的List<List<T>>在每个项目中都不可变T。例如,如果T=string,则您的列表为List<List<string>>,并且您的热门列表中不能包含任何List<int>

您可以使用的列表是List<List<object>>,在使用list时可以帮助您输入的内容是Cast<T>这样的方法:

var list = new List<List<object>>();

var intList = new List<int>() { 1, 2, 3 };
var stringList = new List<string>() { "a", "b", "c" };

list.Add(intList.Cast<object>().ToList());
list.Add(stringList.Cast<object>().ToList());

var sum = 0;
list[0].Cast<int>().ToList()
        .ForEach(i =>
        {
            sum += i;
        });

var msg = "";
list[1].Cast<string>().ToList()
        .ForEach(s =>
        {
            msg += s;
        });

<强>优点:

  • 我们添加了已输入的项目:(List<int>List<string>
  • 我们使用输入的项目:(Cast<int>Cast<string>

答案 2 :(得分:1)

如果我们回想起.NET 1.1的时代,那么System.Collections命名空间中也有很多类,现在几乎没有人使用它们。有了这个说你可以得到这样的东西:

System.Collections.Generic.List<System.Collections.ArrayList> outerList =
  new System.Collections.Generic.List<System.Collections.ArrayList>();