2012-04-09 231 views
4

我知道,我們可以通過以下兩種方式之一初始化數組:(?可能導致內存問題聯繫起來:Enumerable.Repeat has some memory issues?陣列初始化方式

  1. 環路(無內存反射問題)
  2. Enumerable.Repeat

我有兩個問題:

  1. 我們可以初始化一個ARRA y以這種方式使用Array.ForEach

    double[][] myarr = new double[13][]; 
    
    Array.ForEach(myarr, *enter_code_here*); 
    

    我試着用替換enter_code_here

    s => s = new double[2]; 
    

    但它不會初始化myarr

  2. 什麼是沒有任何內存問題的其他數組初始化方法?

+1

'Enumerable.Repeat'沒有問題。程序員不明白它是如何工作和濫用它的。 – Jon 2012-04-09 09:36:32

回答

8

您可以使用Enumerable.Repeat就好初始化任何數組。你需要小心的唯一的事情是,如果數組元素是引用類型的有兩種方法去做:

// #1: THIS ARRAY CONTAINS 10 REFERENCES TO THE SAME OBJECT 
var myarr = Enumerable.Repeat(new object(), 10).ToArray(); 

// #2: THIS ARRAY CONTAINS REFERENCES TO 10 DIFFERENT OBJECTS 
var myarr = Enumerable.Range(0, 10).Select(i => new object()).ToArray(); 

// #3: SAME RESULT AS #2 BUT WITH Enumerable.Repeat 
var myarr = Enumerable.Repeat(0, 10).Select(i => new object()).ToArray(); 
3

A1:不,你不能。 Foreach只是以元素作爲參數執行方法,但不要修改元素。

A2: 可以使用如下因素的方法來解決這個問題

static T[][] CreateArray<T>(int rows, int cols) 
{ 
    T[][] array = new T[rows][]; 
    for (int i = 0; i < array.GetLength(0); i++) 
     array[i] = new T[cols]; 

    return array; 
} 
+0

對於「否,你不能。foreach只是執行元素作爲參數但不修改元素的方法」。 – 2012-04-09 09:51:09

0

這是我創建了一個256行×2列陣列初始化所有值都爲-1。

int[][] myArr = Enumerable.Range(0, 256).Select(i => new int[2] {-1, -1}).ToArray();