ArrayList的解释

时间:2012-01-08 17:30:49

标签: c# casting arraylist

我对ArrayList(C#)有疑问,我想我知道答案但需要确认。我希望有一个坚实的知识基础。

所以这是我的问题: 我正在查看ArrayLists的示例,并遇到了这行代码:

for (int i=1; i<=items.Count; i++)
{Console.WriteLine("{0}. {1}", i, (String)items[i-1]);}  

以下是我认为我知道发生了什么。

  1. 对ArrayList中的每个项执行for循环。
  2. 执行的代码是使用形式参数调用Console的WriteLine方法的方法。
  3. {0}将替换为for循环中i的当前值,{1}将替换为[i - 1]的ArrayList索引中的值。
  4. [i-1]的原因是因为ArrayList的索引从0开始而不是1。
  5. 这是我不确定的。 1.(字符串)&lt;&lt;我相信这是将当前ArrayList索引中的值转换为String类型? 2. ArrayList项的类型是什么?它只是一种对象类型吗?

    这个概念对我来说有点模糊,我只是想要一点清晰。感谢您提供的任何帮助。

7 个答案:

答案 0 :(得分:3)

数组和列表在C#中被索引为0。这意味着第一个项目位于索引0,最后一个项目位于索引items.Count - 1。我认为如果你的for循环从0开始,你的代码会更清楚:

for (int i = 0; i < items.Count; i++)
{
    Console.WriteLine("{0}. {1}", i + 1, (string)items[i]);
} 

ArrayList的索引器的返回类型为object,因此如果您的列表包含字符串,则在从ArrayList获取对象时,通常需要将其强制转换为字符串。但是,在这种特定情况下,由于您呼叫的WriteLine overload具有签名void WriteLine(string, object, object),因此无需执行强制转换。将object传递给此方法是没问题的。在内部,WriteLine方法会在您的对象上调用ToString

您还应该考虑使用通用List<T>类而不是ArrayList。 .NET首次发布时,ArrayList类非常有用,但.NET 2.0或更高版本中的新代码更倾向于使用List<T>

答案 1 :(得分:2)

这个概念有点模糊,因为这个循环是以非标准的方式完成的。在C#中循环遍历数组/列表的惯用方法是使用0起始索引

for (int i = 0; i < items.Conut; i++) {
  String current = (String)items[i];
  Console.WriteLine("{0}. {1}", i + 1, current);
}

代码打印出项目的索引+ 1似乎有点不真实(这就是代码所做的)。这段代码的原作者似乎更熟悉从1开始索引的数组,而不是从0开始的CLR / C#方式。

答案 2 :(得分:0)

  1. (String)&lt;&lt;我相信这是将当前ArrayList索引中的值转换为String类型?
  2. (String)正在转换,这是正确的。根据这个转换,yes ArrayList应该包含String类型的任何对象,否则会有classcastexception。

    1. ArrayList项的类型是什么?它只是一种对象类型吗?
    2. arraylist的类型应该是String的对象。

答案 3 :(得分:0)

与我们在List中定义对象类型的List不同,ArrayLists不是泛型。

事实证明内部 ArrayList使用类型为object的数组来存储其值。在我们的代码中,我们必须将其值视为我们声明List<object>

因此,由于类型未在object之后定义,如果我们想要将它们定义为object的子类(在本例中为String),我们必须强制转换值,因为否则编译器会将其视为object类型,我们将无法执行String操作。


注意:在这种情况下,可能不需要强制转换,因为将隐式调用对象的ToString()方法,但如果我们要执行其他String操作(即Substring),我们实际上需要演员。

答案 4 :(得分:0)

您的分析是正确的。

.NET frameworks 1.0和1.1没有泛型。由于这个ArrayList这个时间的约会有object类型的项目。从.NET 2.0开始,通用List<T>可用,这使得旧的ArrayList在大多数情况下都已过时。

将您的列表定义为

var items = new List<string>();

然后你可以放弃施法。

答案 5 :(得分:0)

  1. 是的,它是i-1在arraylist引用中的单个元素的强制转换。这假设arraylist中的每个元素都是一个字符串。如果没有,则抛出invalidcastexception。如果任何元素为null,则抛出nullreferenceexception。我认为你问这个问题是因为操作的优先级不确定。在不知道优先级的情况下,你可能会对你是否在arraylist中将一个元素转换为字符串或arraylist本身(如果你想尝试这样做会引发一个无效的恶习)感到困惑。如前所述,在这种情况下,它是不必要的,因为tostring将由console.writeline调用。

  2. 是的,arraylist是一个对象列表。如前所述,泛型提供了具有更具体类型项目列表的能力。

  3. 也值得一无所知,以索引1开始循环是不方便的。如果从0开始并使用&lt;生命通常会更好对于循环继续条件而不是&lt; =。更好的是,如果你不需要使用索引本身就是使用foreach循环。

答案 6 :(得分:0)

我会尽力给出严格的解释

  
      
  1. 对ArrayList中的每个项执行for循环。
  2.   

只要条件i&lt; = items.Count保持为真,循环就会继续执行。

  
      
  1. 执行的代码是使用形式参数调用Console的WriteLine方法的方法。
  2.   

正式参数是您在方法的签名中声明的参数。传递给方法的参数称为实际参数。

  
      
  1. {0}将替换为for循环中i的当前值,{1}将替换为4.使用[i - 1]的ArrayList索引中的值。
  2.   

{0}和{1}将替换为在Console.Writeline的第二和第三位置传递的参数的ToString()调用值

  

[i - 1]的原因是因为ArrayList的索引从0开始而不是1。

  

这是我不确定的。 1.(字符串)&lt;&lt;我相信这是将当前ArrayList索引中的值转换为String类型?

你是对的。这是铸造。此外,这种强制转换不是必需的(Console.Writeline在其参数上调用ToString())。如果arraylist中的项的类型不是String,则会导致InvalidCastException。

  
      
  1. ArrayList项的类型是什么?它只是一种对象类型吗?
  2.