2016-10-04 4 views
2

私は現在、テキストファイルのフォルダからデータを読み込む関数を作成しています。別の変数を変更すると、このリストはなぜ<T>に更新されますか?

public void loadPatterns() 
{ 
    string[] files = Directory.GetFiles("patterns/"); 
    Level pattern = new Level(); 
    List<char> row = new List<char>(); 
    List<List<char>> grid = new List<List<char>>(); 

    for(int i = 0; i < files.Length; i++) 
    { 
     var lines = File.ReadLines(files[i]); 
     foreach(string line in lines) 
     { 
      foreach(char c in line) 
      { 
       row.Add(c); 
      } 
      grid.Add(row); 
      row.Clear(); 
     } 
     pattern.grid = grid; 
     patterns.Add(pattern); 
     grid.Clear(); 
    } 
} 

しかしforeach(string line in lines)ループ終了すると現時点では、グリッドは完全に空である行数を有します。デバッガを調べた後、グリッドに1行追加した後でも、row.Clear()メソッドは、リストに追加されたデータをクリアし、ローカル変数 'row'のデータをクリアするように見えます。

どうしてですか?

私は主にC++のプログラマーなので、C#をよく知っている人にとっては非常に明白なことを忘れてしまった場合は謝罪します。

+1

C#がコンテナではなく、値のセマンティクスのための参照セマンティクスを持っています。 – milleniumbug

+1

うん、@ミレニウムバグが正しいです。ループ内で新しい行を呼び出す必要があります。なぜClear()が必要ですか? – marlo

+0

助けてくれてありがとう、マシューの答えが働いた。私のテキストファイルは5×5文字の配列を持っているので、クリアが必要です。 'row'変数にはテキストファイルの各行が含まれるため、各行が終了するか、 'row'変数が大きな文字列になるたびにクリアする必要があります。 これを見ても、グリッドを 'List 'にして、グリッドに 'string'として各行を追加するだけです。この文字列を後にトラバースすることは、基本的にCharsのListをトラバースすることと同じです。 –

答えて

3

で新しいrowを作成する必要があります。行への参照を追加しています。したがって、row.Clear()に電話すると、グリッド内に格納されている行が消去されます。

これを修正するには、グリッドの各行に対して新しい行を作成する必要があります。これを行うには、ちょうどforeach(string line in lines)rowの宣言を移動:

foreach(string line in lines) 
{ 
    var row = new List<char>(); 
    ... 
+0

あなたの助けをありがとう!あまりにもC + +でコピーされるすべてに慣れていた。 –

3

あなたはrow.Clear()であなたのリストをクリアしています。あなたはgrid.Add(row);呼び出すときにグリッドに行のコピーを追加していないrow = new List<char>()

public void loadPatterns() 
{ 
    string[] files = Directory.GetFiles("patterns/"); 
    Level pattern = new Level(); 
    List<char> row = new List<char>(); 
    List<List<char>> grid = new List<List<char>>(); 

    for(int i = 0; i < files.Length; i++) 
    { 
     var lines = File.ReadLines(files[i]); 
     foreach(string line in lines) 
     { 
      foreach(char c in line) 
      { 
       row.Add(c); 
      } 
      grid.Add(row); 
      row = new List<char>(); // <- 
     } 
     pattern.grid = grid; 
     patterns.Add(pattern); 
     grid.Clear(); 
    } 
} 
関連する問題