C#中的ArrayList可以存储异构数据

时间:2013-11-04 15:50:05

标签: c# arraylist type-safety heterogeneous

是否可以在一个arraylist中存储整数,字符串和用户定义的类对象,如

ArrayList a=new ArrayList();

class Demo {}
Demo d=new Demo();

a.Add(12);

a.Add("Faizal Sardar Khan");

a.Add(d);

如果一切皆有可能,那么如何访问存储的元素(如何投出')? 如果没有,那么有没有办法实现这个?

5 个答案:

答案 0 :(得分:2)

您可以使用is关键字来检查对象的类型:

if (a[0] is String) /* do something */
if (a[1] is Demo) /* something other */

答案 1 :(得分:1)

您可能并不关心那里有什么对象,因此您可以将它们视为对象。

foreach(var o in myList)
   Console.WriteLine(o);

如果你完全了解类型,你可以施展。

Dog dog = (Dog)myList[26];
dog.Bark();

如果你想要不同的行为取决于类型而你知道它们在哪里,你可以检查它们是什么:

// Reference types:
Dog dog = myList[i] as Dog;
if (dog != null)
   dog.Bark();
Cow cow = myList[i] as Cow;
if (cow != null)
   cow.Moo();
// Value types:
if (myList[i] is int)
   DoSomethingWith((int)myList[i]);

无论如何以及为何,这些只是同一设计气味的变化......

答案 2 :(得分:0)

是的,这当然是可能的。也可以通过List<Object>来实现。至于铸造,这取决于。您如何知道列表中的位置?但要完成你的样本:

int twelve = (int)a[0];
string s = (string)a[1];
Demo e = (Demo)a[2];

很高兴知道你的最终目标是什么,因为我希望你尝试使用ArrayList作为它不是真正想要的东西,我们可以建议一个更好的方法。

答案 3 :(得分:0)

可能(如果不可取)将不同类型的对象插入到ArrayList中,因为它只保存对象。

如何让他们再次出局是棘手的。一种方法是只有一堆if条件来检查对象是否属于某种类型,然后将其强制转换为该类型。

答案 4 :(得分:0)

您必须先检查元素的类型,然后才能使用它:

Object anything = list[0];
if (anything is Int32) {
   var number = (Int32) anything;
} else if (anyting is String) {
   var text = (String) anything;
} else {
   if (Object.ReferenceEquals(null, anything)) {
       throw new NotSupportedException("The element is NULL.");
   } else {
       throw new NotSupportedException("Unexpected type of the element \"" + anything.GetType().Name + "\".");
   }
}