如何创建包含不同类型列表的列表

时间:2017-05-10 10:47:04

标签: c#

假设我有这样的名单:

var firstList = new List<ofsometype>();
var secondList = new List<ofsomeanothertype>();
var thirdList = new List<anothertype>();

如何制作接受这些列表的列表?像

var mainList = new List<???>();
mainList.Add(firstlist);
mainList.Add(secondlist);
mainList.Add(thirdlist);

感谢。

2 个答案:

答案 0 :(得分:5)

我可能会使用Dictionary集合:

var firstList = new List<ofsometype>();
var secondList = new List<ofsomeanothertype>();
var thirdlist = new List<anothertype>();

var listsDict = new Dictionary<Type, object>();
listsDict.Add(typeof(ofsometype), firstlist);
listsDict.Add(typeof(ofsomeanothertype), secondlist);
listsDict.Add(typeof(anothertype), thirdlist);

这里的优点是它可以为您提供有关列表类型的信息。这可以用于两件事:

  1. 仅限特定类型的过滤器列表
  2. 稍后只需使用密钥
  3. 即可了解List<object>的类型

    P.S。

    根据解决方案的内容以及您需要实现的目标,您可以使用泛型(如果已知类型)或dynamic s - 如果类型未知,但仍然是运行时的动态操作 - 如果编译器不知道类型,则需要时间。

答案 1 :(得分:2)

如果要从不同类型的列表中添加项目,则需要共享公共基类,或者从同一接口继承,例如

ofsometype : ISomeInterface
ofsomeanothertype: ISomeInterface
anothertype: ISomeInterface

var firstList = new List<ofsometype>();
var secondList = new List<ofsomeanothertype>();
var secondList = new List<anothertype>();

var mainList = new List<ISomeInterface>();
mainList.AddRange(firstlist);
mainList.AddRange(secondlist);
mainList.AddRange(thirdlist);

在从列表中检索项目时,您将被限制访问ISomeInterface公开的成员,除非您采用强制转换/反射。

这也可以通过将它们添加到List<object>来实现,但这样您就无需了解列表中包含的内容。