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

3

假设我有以下这些列表:

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
使用 List<object> - 但这样你就会进入强制转换的领域... - Matthew Watson
除非他们实现了一些通用的东西,否则你只能使用 List<object>List<T> 也实现了一些非泛型接口,但是如果不知道你打算如何使用列表以及你打算如何使用它,那么就无法给你提供更具体的建议。 - Lasse V. Karlsen
@LasseV.Karlsen 实际上我正在生成许多类型的列表,然后将它们连接起来。就这样。 - jason
2
你也可以尝试使用var mainList = new List<IList>(); - Bojan B
如果这些类型是你自己定义的,你可以为它们添加一个漂亮的接口,最好提供有用的服务而不仅仅是可列出的功能。 - TaW
3个回答

5

我会建议使用字典集合:

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. 稍后通过使用键来知道List<object>的类型
附注:
根据解决方案和所需实现的内容,如果类型已知,则可以使用泛型;如果类型未知但仍需要在运行时进行动态操作,则可以使用dynamic,如果编译器不知道类型。

我更喜欢这个答案而不是IList的列表,它读起来更清晰,并且可以避免其他解决方案中的许多强制转换问题。 - Dillanm
你能举个转换的例子吗? - jason
@Dillanm 为什么这可以避免类型转换问题?你仍然需要对列表进行强制类型转换,而使用对象列表则需要对对象进行强制类型转换。我不明白为什么这是更好的解决方案。 - Maarten
@Dillanm 说实话,这可以使用反射来完成,但它可能会影响性能,而且使用键更容易。 - Fabjan
@ВиталийТерзиев ArrayList已经过时了,似乎现在没有人使用它。Marc Gravell解释了原因:https://dev59.com/tXRC5IYBdhLWcg3wKtv2 - Fabjan
显示剩余2条评论

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>中来实现,但这几乎不提供有关列表中包含的内容的任何信息。


1
谢谢您的回答。如果我使用 List<object>,我是否能够遍历主列表并获取成员(不同类型的列表)? - jason
@jason,你有没有考虑使用字典选项,其中键将是类型,值将是IList对象?这将使在检索列表时转换变得更容易 - 尽管仅当某种类型最多只能有一个列表时才有效。 - Bojan B

0

只需使用 Object。

List<Object>Object[] 作为数组

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

我建议这样做。
var mainList = new List<Object[]>();
mainList.Add(firstlist.toArray());
mainList.Add(secondlist.toArray());
mainList.Add(thirdlist.toArray());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接