2017-05-04 55 views
-1

我試圖使用Array增加數組的大小.Copy C#內置static方法。 代碼如下:Array.Copy異常

public class MyClass 
{ 
    private int Capacity { get; set; } 
    private int Size { get; set; } 
    private int[] Nodes { get; set; } 

    public MyClass() 
    { 
     Capacity = 5; 
     Size = 0; 
     Nodes = new int[Capacity]; 
    } 

    public void EnlargeIfNeeded() 
    { 
     if (Size == Capacity) 
     { 
      Capacity = 2 * Capacity; 
      Array.Copy(Nodes, Nodes, Capacity); 
     } 
    } 
} 

它拋出以下異常,當方法EnlargeIfNeeded()被調用:

system.argument.exception: Source array was not long enough. Check srcIndex and length, and the array's lower bound

是否確定使用以下?我的單元測試通過OK,現在:

public void EnlargeIfNeeded() 
    { 
     if (Size == Capacity) 
     { 
      Capacity = 2 * Capacity; 
      var dest = new int[Capacity]; 
      Array.Copy(Nodes, dest, Capacity/2); 
      Nodes = dest; 
     } 
    } 
+5

你期望加倍場'Capacity'影響陣列'Nodes'的實際容量? 'Array.Copy'當然不會這樣做。 – dasblinkenlight

+0

是的,我最終的目的是將陣列容量加倍。 –

+4

我建議你仔細閱讀'Array.Copy'的文檔。你目前沒有正確使用它。您可能想使用'Nodes = Array.Resize(Nodes,Capacity)'來代替。但爲什麼你基本上重新創建'List '? –

回答

1

如果您嘗試調整數組的大小,使用List集合可能是一種更好的方法,因爲它本機地以更有效的方式實現了數組大小調整。

https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx

+0

我的要求是使用數組(int [])。謝謝,建議。 –

+0

所以... Array.Resize(ref Nodes,Capacity); – Barletta

+0

對不起,但不能使用Array.Resize(ref Nodes,Capacity)。編譯時錯誤:ref關鍵字不能用於屬性或索引器 –

1

看起來你只想要Array.Resize

此外,我建議擺脫Capacity成員,所以你有更少的狀態照顧自己。 (NB:下面是幹編碼,所以YMMV。)

public class MyClass 
{ 
    private int Size { get; set; } 
    private int[] Nodes { get; set; } 

    public MyClass() 
    { 
     Size = 0; 
     Nodes = new int[5]; 
    } 

    public void EnlargeIfNeeded() 
    { 
     if (Size == Nodes.Length) 
     { 
      Array.Resize(ref Nodes, Nodes.Length * 2); 
     } 
    } 
} 

編輯:添加缺少的ref關鍵字。

+0

使用你的代碼,我得到一個錯誤:參數1必須通過'ref'關鍵字,在行:Array.Resize(節點,Nodes.Length * 2) –

+0

@JoanDimko:良好的捕獲。添加了關鍵字。 – AKX

+0

您應該使int []節點爲字段 –