Collections和List如何存储不同类型的对象?可能吗?

时间:2010-12-03 09:09:34

标签: c#

泛型集合和List如何存储不同类型的对象?可能吗?

因为集合和列表是arraylist的替代

3 个答案:

答案 0 :(得分:6)

如果您需要存储各种类型,则需要将您的集合声明为所有其他类型兼容的类型。

例如,要将MemoryStreamFileStream放在一个列表中,您可能会有一个List<Stream>

List<Stream> streams = new List<Stream>();
streams.Add(new MemoryStream());
streams.Add(new FileStream(...));

对于更多不同类型,您可能需要转到List<object>

List<object> objects = new List<object>();
objects.Add("hello"); // A String
objects.Add(5); // An Int32
objects.Add(new Button());
objects.Add(Guid.NewGuid());

请注意,在这种情况下,值类型值将被装箱 - 而它们不会在特定值类型的列表中。

要使用任何特定于类型的元素成员,您需要检查它们是否是正确的类型并进行转换,例如:使用is和演员,或as

string maybeString = objects[0] as string;
if (maybeString != null)
{
    Console.WriteLine("String of length {0}", maybeString.Length);
}

答案 1 :(得分:1)

好吧,你需要让列表存储最常见的分母;如果您想存储任何内容,则需要List<object>()List<IMyCommonInterface>()

但是,根据我的经验,如果您发现自己编码如此,则可能需要重新考虑您的架构。

也许您可以解释一下您想要实现的解决方案?

答案 2 :(得分:1)

通用集合的主要优点是您可以指定要存储在集合中的确切类型,而不需要装箱。

你有一些选择:

  • 您坚持使用System.Collections命名空间中的非通用集合,该集合将对象作为参数。
  • 您可以创建类型对象的通用集合。这或多或少与上面相同,但您可以使用IEnumerable<T>存在的所有扩展方法。
  • 您可以创建一个通用接口的通用集合,您希望存储,实现所有类型。