2017-11-08 9 views
3

リスト内にリストを追加しようとしています。しかし、私はサブリストからアイテムを取得することができませんでした。エラーはありませんが、サブリストからデータが取得されませんでした。注目してくださいGenerateClue()私はエラーがあると思います。サブリスト項目がC#で表示されない

私はclueList[0][0]を使用してデータにアクセスしようとしているときに、何のデータ

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using System; 
using UnityEngine.UI; 

public class TrainingMode : MonoBehaviour { 
    private List<int> answerKey; 
    private List<int> clue; 
    private List<List<int>> clueList; 
    private int correct; 
    private int wellPlaced; 
    public Text answerKeyText; 
    System.Random random = new System.Random(); 

    void Start() { 
     answerKey = new List<int>(); 
     clue = new List<int>(); 
     clueList = new List<List<int>>(); 

     GenerateAnswerKey(); 
     GenerateClue(); 

     //CheckCorrectAndWellPlaced(); 

     answerKeyText.GetComponent<Text>().text = answerKey[0] + " "+ answerKey[1] + " "+ answerKey[2]; 
     foreach (List<int> arrClue in clueList) 
     { 
      foreach (int item in arrClue) 
      { 
       Debug.Log(item); 
      } 
     } 
    } 

    private void GenerateClue() 
    { 

     //Generate clue 
     for (int j = 0; j <= 5; j++) 
     { 
      for (int i = 0; i <= 2; i++) 
      { 
       int randomNumber = random.Next(0, 9); 
       if (clue.Contains(randomNumber)) 
       { 
        i--; 
       } 
       else 
       { 
        clue.Add(randomNumber); 
       } 

       if (clue.Count == 3) 
       { 
        clueList.Add(clue); 
        clue.Clear(); 
       } 
      } 
     } 
    } 

    private void CheckCorrectAndWellPlaced() 
    { 
     correct = 0; 
     wellPlaced = 0; 
     //Check for correct and wellplaced numbers 
     for (int i = 0; i <= 2; i++) 
     { 
      if (answerKey.Contains(clue[i])) 
      { 
       correct++; 
      } 
      if (clue[i] == answerKey[i]) 
      { 
       wellPlaced++; 
      } 
     } 
    } 

    private void GenerateAnswerKey() { 
     //Generate answerkey 
     for (int i = 0; i <= 2; i++) 
     { 
      int randomNumber = random.Next(0, 9); 
      if (answerKey.Contains(randomNumber)) 
      { 
       i--; 
      } 
      else 
      { 
       answerKey.Add(randomNumber); 
      } 
     } 
    } 
} 
+0

問題はここにある "; clue.Clear(); clueList.Add(手掛かり)" - リストに追加すると、オブジェクトのコピーが作成されず、オブジェクトへの参照が追加されます。 – PaulF

+0

以下のコメントをフォローアップする - GenerateClue()メソッドの無限ループに乱れている可能性があります。もし乱数がカウンタiで終わる可能性のある値を繰り返すならば、私は2に達しません。ループをwhileループからwhileループに変更する - while(clue.Count <3) " – PaulF

答えて

2

問題は、あなたがリスト<>がクラスであるため、参照を渡しているもの、それは実際にやっているあなたの手がかりリストに手がかりを追加したときということです。つまり、2つの変数が同じメモリを指していることになります。 1つは手がかり変数で、もう1つはclueList [X]です。だからあなたがclue.Clear()を呼び出すと、あなたのclueList [X]と実際に同じメモリである手がかりリストをクリアしています。この中

if (clue.Count == 3) 
{ 
    clueList.Add(clue); 
    clue.Clear(); 
} 

:修正プログラムは、ちょうどこの変更のように

if (clue.Count == 3) 
{ 
    clueList.Add(new List<int>(clue)); 
    clue.Clear(); 
} 
+0

これは機能します!詳細な説明をいただきありがとうございます –

1

あなたの問題がここにはありません。

if (clue.Count == 3) 
{ 
    clueList.Add(clue); 
    clue.Clear(); 
} 

あなたはclueListclueを追加し、クリアしていますclueは同じ "メモリアドレス"(clueListと同じオブジェクト)を持ちます。

一般的に、clueのリストにいくつかの乱数を入れておき、空になったらそれをもう一度空にします。

代わりに、for-loopの先頭にintの新しいリストを作成してみてください。

for (int j = 0; j <= 5; j++) 
{ 
    var list = new List<int>(); 
    for (int i = 0; i <= 2; i++) 
    { 
     int randomNumber = random.Next(0, 9); 
     if (list.Contains(randomNumber)) 
     { 
      i--; 
     } 
     else 
     { 
      list.Add(randomNumber); 
     } 

     if (list.Count == 3) 
     { 
      clueList.Add(list); 
     } 
    } 
} 
0

clueListに置かれた要素に対してClear()コールが動作しないように、リストのコピーを作成する必要があります。

if (clue.Count == 3) 
    { 
     clueList.Add(clue.ToList()); 
     clue.Clear(); 
    } 

しかし、私はまた、リストが挿入されることはありません時に乱数が、それは常に同じだとあなたがループのため外出続けるとき例が存在する可能性があるため、例があり得ることだと思います。

for (int j = 0; j <= 5; j++) 
     { 
      for (int i = 0; i <= 2; i++) 
      { 
       int randomNumber = random.Next(0, 9); 
       if (clue.Contains(randomNumber)) 
       { 
        i--; 
       } 
       else 
       { 
        clue.Add(randomNumber); 
       } 

       if (clue.Count == 3) // EDIT: what if it never reaches 3 ? 
       { 
        clueList.Add(clue.ToList()); 
        clue.Clear(); 
       } 
      } 
     } 
+0

またはclueList.Add(clue.ToList()); – PaulF

+0

あなたの提案はより良いですが、.NET 3.5以降が必要です。 – farbiondriven

+0

UnityでサポートされているLINQが必要です –

関連する問題