2012-04-10 9 views
2

double [] [] []の配列をdouble [1] [2] [3]として初期化できますか? linqを使用して正しい構文ではありません)。ループのための一つの方法を使用してdouble [1] [2] [3] LINQを使用してdouble [] [] []を初期化する

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]; 
    } 
} 

ですが、私はクリーンなコードが欲しいです。私は選択を試みたが、それは最初のレベルのみを満たしている。それについてどうやって行くの?ありがとう

& btwこれは宿題ではありません!それは効率的ではないであろうアイテムの大多数のためのよう

+0

は、あなたがその選択のためのあなたのコードを示してもらえますか? – MarcinJuraszek

+0

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

+1

私はあなたが既に持っているコードは最も読みやすいです – Blablablaster

答えて

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

しかし、これはメモリコピーを行う複数のToArray()のコールが必要ですので、「エレガント」ソリューションのような種類が自由のためではありません(下記実装における参照)。ところで、私はforループソリューションを好むだろう。

Enumerable.ToArray()実装:(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; 
} 
関連する問題