2012-01-08 35 views
0

我有一個關於ArrayList(C#)的問題,我想我知道答案但需要確認。我想要一個堅實的知識基礎。ArrayList的解釋

因此,這裏是我的問題: 我一直在尋找例子的ArrayList和跨越這行代碼來:

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

這是我想我知道發生了什麼事情。

  1. 爲ArrayList中的每個項目執行for循環。
  2. 執行的代碼是一個方法調用具有正式參數的控制檯的WriteLine方法。
  3. 將{{}替換爲for循環中的i的當前值,{1}將替換爲[i - 1]的ArrayList索引中的值。
  4. 的原因[我 - 1]是因爲一個ArrayList的索引從0開始,而不是1

這裏是什麼我不確定。 1.(字符串)< <這我相信是將當前ArrayList索引中的值轉換爲String類型? 2.什麼是ArrayList項目的類型?它只是一個對象類型?

這個概念對我來說有點模糊,我只是在尋找一點清晰。感謝您的任何幫助。

+2

開始,而不是看着System.Collections.Generic命名空間列表''的例子。 'ArrayList'不是首選的集合類型,除非您正在使用遺留1.1代碼。 – 2012-01-08 17:36:51

+0

'ArrayList'是一個鬆散類型的集合,它存儲'object'類型的對象。 '(String)items [i-1]'中的'(String)'應該是不必要的,因爲'Console.WriteLine'會通過調用對象的ToString()方法在幕後執行這個強制轉換。 – 2012-01-08 17:36:59

+0

在我看來,你總是比ArrayList更多地討論C#的問題...... – 2012-01-08 19:31:54

回答

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>

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比開始的CLR/C#的方式爲0

0
  1. (串)陣列< <這個我相信是鑄造的價值當前的ArrayList索引爲一個String類型?

(字符串)是鑄造,這是正確的。根據這個投射,是的,ArrayList應該包含任何類型爲String的對象,否則會有classcastexception。

  1. 什麼是ArrayList項目的類型?它只是一個對象類型?

陣列列表的類型應該是字符串的對象。

0

與我們定義List中對象類型的List不同,ArrayLists不是泛型。

事實證明內部該ArrayList使用object類型的數組來存儲其值。在我們的代碼中,我們必須將它的值視爲我們宣佈List<object>

因此,由於類型不過去object定義,我們必須,如果我們想要將它們定義爲object(即String在這種情況下)的子類,否則編譯器會把它當作類型轉換我們的價值觀object和我們將無法執行String操作。


注:在這種情況下,中投可能不是必要的,因爲對象的ToString()方法將隱式調用,但如果我們想執行其他String操作(即Substring)我們其實需要的演員。

0

你的分析是正確的。

.NET框架1.0和1.1沒有泛型。因爲這個約會從這個ArrayListobject類型的項目。從.NET 2.0開始,可以使用通用的List<T>,這在大多數情況下會使舊的ArrayList過時。

定義你的列表,

var items = new List<string>(); 

然後你就可以刪除鑄件。

0
  1. 是的,它是由i-1對陣列列表引用中的單個元素的字符串進行轉換。這是假定arraylist中的每個元素都是一個字符串。如果有的話,將會拋出一個invalidcastexception。如果任何元素爲null,則拋出nullreferenceexception。我想你是在問這個問題,因爲對操作的優先級不確定。在沒有優先級知識的情況下,您可能會對將數組列表中的元素轉換爲字符串還是數組列表本身感到困惑(這會導致invalidcastexception,您是否嘗試這樣做)。如前所述,在這種情況下,它是沒有必要的,因爲tostring將被console.writeline調用。

  2. 是的,arraylist是一個對象列表。如前所述,泛型提供了具有更具體類型項目列表的能力。

也沒什麼價值,以索引1開始循環是不方便的。如果從0開始並且使用<作爲循環繼續條件而不是< =,則生活通常更好。更好的是,如果你不需要使用索引本身就是使用foreach循環。

0

我會盡力給

  1. 一個for循環在ArrayList中的每個項目執行嚴格的解釋。

循環繼續只要我< = items.Count保持爲真,執行作爲條件。

  1. 執行的代碼是一個方法調用控制檯的一個正式的參數WriteLine方法。

形式參數是一個,你的方法的簽名聲明。傳遞給該方法的參數稱爲實際參數。

  1. {0}將與具有在該ArrayList索引i的值的電流值對循環和{1}將被替換4.代替[I - 1]。

{0}和{1}將與的ToString的值代替()的那些在Console.WriteLine命令

的原因的第二和第三位置傳遞的參數呼叫爲[I - 1]因爲一個ArrayList的索引從0開始,而不是1。

這是我不確定的。 1.(字符串)< <這我相信是將當前ArrayList索引中的值轉換爲String類型?

你說得對。這是鑄造。此外,這種轉換不是必需的(Console.Writeline在其參數上調用ToString())。如果arraylist中的項目的類型不是String,它將導致InvalidCastException。

  1. 什麼是一個ArrayList項的類型?它只是一個對象類型?