2012-04-10 4 views
2

Können wir ein Array von double [] [] [] als double [1] [2] [3] initialisieren (this ist nicht die richtige Syntax) mit linq.Initialisiere double [] [] [] als double [1] [2] [3] mit LINQ

mit for-Schleife ein Weg ist,

double[][][] myarr = new double[1][][]; 
for(int i=0; i<1; i++) 
{ 
    myarr[i] = new double[2][]; 
    for(int j=0; j<2; j++) 
    { 
     myarr[i][j] = new double[3]; 
    } 
} 

, aber ich möchte einen saubereren Code. Ich habe Select versucht, aber es füllt nur das erste Level. Wie es geht. Danke

& Btw das ist keine Hausaufgaben !!

+0

Könnten Sie zeigen Ihren Code für das wählen? – MarcinJuraszek

+0

http://stackoverflow.com/questions/1099731/initialize-a-jagged-array-the-linq-way ODER http://stackoverflow.com/questions/1738990/initializing-multidimensional-jagged-arrays –

+1

Ich denke, die Code, den Sie bereits haben, ist am besten lesbar – Blablablaster

Antwort

4
double[][][] threeDimensionArray = 
    Enumerable.Range(0, 1) 
      .Select(h1 => Enumerable.Range(0, 2) 
            .Select(h2 => new double[3]) 
            .ToArray()) 
      .ToArray(); 

Aber dies erfordert mehrere ToArray() Anrufe, die Speicherkopie tun (siehe implementaiton unten) so für grosse Stückzahl wäre es nicht effizient sein, so eine solche Art von „elegant“ Lösung ist nicht kostenlos. Übrigens würde ich for Loop-Lösung bevorzugen.

Enumerable.ToArray() Umsetzung: (Kredite ILSpy)

// System.Linq.Enumerable 
public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source) 
{ 
    if (source == null) 
    { 
     throw Error.ArgumentNull("source"); 
    } 

    // sll: see implementation of Buffer.ToArray() below 
    return new Buffer<TSource>(source).ToArray(); 
} 

// System.Linq.Buffer<TElement> 
internal TElement[] ToArray() 
{ 
    if (this.count == 0) 
    { 
     return new TElement[0]; 
    } 
    if (this.items.Length == this.count) 
    { 
     return this.items; 
    } 
    TElement[] array = new TElement[this.count]; 
    Array.Copy(this.items, 0, array, 0, this.count); 
    return array; 
}