2016-11-28 50 views
1

我定義的Array整個元素代替:陣列返回的第一個元素字符

function GetNames 
{ 
    $names = New-Object System.Collections.ArrayList 
    $names += "Drin" 
    $names 
} 

現在我想從Array採取的第一個名字:

$names = GetNames 
$firstName = $names[0] 

因此,現在的$firstName收到Drin我得到D

回答

1

如果您檢索的類型$names使用GetType()你會看到,$names實際上是一個字符串 - 這樣你,如果你訪問的第一個索引的第一個字符:

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  String         System.Object 

注:這是因爲你只需要在管道單個元素。要強制$names是一個數組,你必須明確地聲明它:

$names = @(GetNames) 

還要注意的是,你不必使用New-Object創建一個數組。您也可以使用它聲明:

function GetNames 
{ 
    @('Drin') 
} 
+0

也是一種有趣的方式來做到這一點:' $ names =,(GetNames)' – 4c74356b41

0

如果你運行你的代碼,是的,但把$names.GetType()中的每一行之間你得到這樣的:

$names = New-Object System.Collections.ArrayList 
$names.GetType() 
$names += "Drin" 
$names.GetType() 

IsPublic IsSerial Name          BaseType                               
-------- -------- ----          --------                               
True  True  ArrayList        System.Object                              
True  True  Object[]         System.Array  

通過調用$names += "Drin"你重新定義的類型$names。這並不直觀(至少對我來說是一個C#開發),但這就是發生了什麼。

如果用.Add(...)方法做它,然後它會很好地工作:

$names = New-Object System.Collections.ArrayList 
$names.GetType() 
$names.Add("Drin") 
$names.GetType() 
$names[0] 

這給:

 
IsPublic IsSerial Name          BaseType                               
-------- -------- ----          --------                               
True  True  ArrayList        System.Object                              
0 
True  True  ArrayList        System.Object                              
Drin 

類型的$names保持不變,你會得到正確的結果出來。

正確的方法是避免使用ArrayList(它是如此2001年後)。取而代之的是@()。試試這個:

$names = @() 
$names.GetType() 
$names += "Drin" 
$names.GetType() 
$names[0] 

這給:

 
IsPublic IsSerial Name          BaseType                               
-------- -------- ----          --------                               
True  True  Object[]         System.Array                              
True  True  Object[]         System.Array                              
Drin 

正如馬丁在評論中指出,該功能應該是這樣的:

function GetNames 
{ 
    $names = @() 
    $names += "Drin" 
    $names 
} 
+0

您提供的信息是正確的,但不會解決他的問題... –

+0

@MartinBrandl - 怎麼樣? – Enigmativity

+0

如果複製他的函數並將代碼粘貼到其中並使用'$ names = GetNames'調用它,您將看到'$ names [0]'仍然返回'D''。這是因爲你必須將函數的* return *值強制轉換爲數組。這就是這裏的實際問題(除了你提到的他也可以使用@()) –

相關問題