2012-04-09 178 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();