2012-04-09 7 views
4

Ich weiß, dass wir ein Array in einer von zwei Arten initialisiert werden können: (? Wahrscheinlich Speicherprobleme verursacht Verweis: Enumerable.Repeat has some memory issues?)Array Initialisierung Wege

  1. Schleife (keine Memory-Reflexionsfragen)
  2. Enumerable.Repeat

ich habe zwei Fragen:

  1. können wir ein arra initialisieren y mit Array.ForEach auf diese Weise?

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

    Ich versuchte enter_code_here mit dem Ersetzen:

    s => s = new double[2]; 
    

    aber nicht myarr nicht initialisiert werden.

  2. Was sind die anderen Array-Initialisierungsmethoden ohne Speicherprobleme?

+1

'Enumerable.Repeat' haben keine Probleme. Programmierer, die nicht verstehen, wie es funktioniert und es missbrauchen. – Jon

Antwort

8

Sie können Enumerable.Repeat verwenden lösen nur gut jede Array zu initialisieren. Das einzige, was Sie brauchen, von vorsichtig zu sein, ist, dass, wenn das Array Element eines Referenztyp ist, gibt es zwei Möglichkeiten, darüber zu gehen:

// #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: Nein, das geht nicht. Foreach führt nur die Methode mit dem Element als Parameter aus, nicht jedoch die Elemente.

A2: Sie können die Folowing-Methode verwenden, um das Problem

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

+1 für "Nein, Sie können nicht. Foreach führt nur die Methode mit dem Element als Parameter aus, ändert aber keine Elemente." –

0

Dies ist, wie ich erstellt eine 256 Reihe x 2 Spaltenanordnung und initialisiert Alle Werte bis -1.

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