是否可以声明一个对象是 列表的泛型类型。
所以有点像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。
答案 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>();