2012-04-09 18 views
4

私たちは2つの方法のいずれかで配列を初期化することができることを知っている:(?おそらくメモリの問題が発生するリンク:Enumerable.Repeat has some memory issues?アレイの初期化の方法は

  • Enumerable.Repeat

    1. ループ(いいえメモリの反射の問題)

    1. たちはARRAを初期化することができます:

      私は2つの質問がありますこの方法で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

    答えて

    8

    を解決するためにfolowingメソッドを使用することができます。

    // #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: あなたが任意の配列を初期化するEnumerable.Repeatをうまく使うことができ、問題

    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 "いいえ、できません。Foreachは単に要素をパラメータとしてメソッドを実行しますが、要素は変更しません。" –

    0

    これは私が256行×2列の配列を作成し、初期化方法をされて:あなたが注意する必要がある唯一のものは、配列の要素が参照型である場合にはそれについて移動するには、2つの方法があるということですすべての値は-1になります。

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

    関連する問題