我对ArrayList(C#)有疑问,我想我知道答案但需要确认。我希望有一个坚实的知识基础。
所以这是我的问题: 我正在查看ArrayLists的示例,并遇到了这行代码:
for (int i=1; i<=items.Count; i++)
{Console.WriteLine("{0}. {1}", i, (String)items[i-1]);}
以下是我认为我知道发生了什么。
这是我不确定的。 1.(字符串)&lt;&lt;我相信这是将当前ArrayList索引中的值转换为String类型? 2. ArrayList项的类型是什么?它只是一种对象类型吗?
这个概念对我来说有点模糊,我只是想要一点清晰。感谢您提供的任何帮助。
答案 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)
(String)正在转换,这是正确的。根据这个转换,yes ArrayList应该包含String类型的任何对象,否则会有classcastexception。
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)
是的,它是i-1在arraylist引用中的单个元素的强制转换。这假设arraylist中的每个元素都是一个字符串。如果没有,则抛出invalidcastexception。如果任何元素为null,则抛出nullreferenceexception。我认为你问这个问题是因为操作的优先级不确定。在不知道优先级的情况下,你可能会对你是否在arraylist中将一个元素转换为字符串或arraylist本身(如果你想尝试这样做会引发一个无效的恶习)感到困惑。如前所述,在这种情况下,它是不必要的,因为tostring将由console.writeline调用。
是的,arraylist是一个对象列表。如前所述,泛型提供了具有更具体类型项目列表的能力。
也值得一无所知,以索引1开始循环是不方便的。如果从0开始并使用&lt;生命通常会更好对于循环继续条件而不是&lt; =。更好的是,如果你不需要使用索引本身就是使用foreach循环。
答案 6 :(得分:0)
我会尽力给出严格的解释
- 对ArrayList中的每个项执行for循环。
醇>
只要条件i&lt; = items.Count保持为真,循环就会继续执行。
- 执行的代码是使用形式参数调用Console的WriteLine方法的方法。
醇>
正式参数是您在方法的签名中声明的参数。传递给方法的参数称为实际参数。
- {0}将替换为for循环中i的当前值,{1}将替换为4.使用[i - 1]的ArrayList索引中的值。
醇>
{0}和{1}将替换为在Console.Writeline的第二和第三位置传递的参数的ToString()调用值
[i - 1]的原因是因为ArrayList的索引从0开始而不是1。
右
这是我不确定的。 1.(字符串)&lt;&lt;我相信这是将当前ArrayList索引中的值转换为String类型?
你是对的。这是铸造。此外,这种强制转换不是必需的(Console.Writeline在其参数上调用ToString())。如果arraylist中的项的类型不是String,则会导致InvalidCastException。
- ArrayList项的类型是什么?它只是一种对象类型吗?
醇>
右