【问题标题】:C# How to iterate throught all the lists in child's list?C#如何遍历子列表中的所有列表?
【发布时间】:2015-12-10 04:04:15
【问题描述】:

所以我已经停止了这个我想不出的解决方案的问题,虽然我认为我在另一个项目上做了同样的事情,但我现在忘记了它,但我丢失了文件..

问题是,我正在编写一个对话系统,它有一个答案行,最多 3 个问题行,每一个问题行,当点击时,都有另一个答案行,并且可以提出更多问题。

我们的目标是能够制作一个对话系统,可以根据需要提供尽可能多的答案和问题。

但我不知道如何迭代它们,如果它是一个固定的数字,我可以为每个问题的数量做一个 for 循环,但事实并非如此,我坚持下去!

以下代码是固定数量的ONE问题及其答案和另一个问题列表的示例:

for(int i = 0; i < dialogGiver.dialogLines.Count; i++)
{
    EditorGUILayout.LabelField("Line " + i, EditorStyles.boldLabel);

    dialogGiver.dialogLines[i].line = EditorGUILayout.TextField("Question", dialogGiver.dialogLines[i].line);
    dialogGiver.dialogLines[i].answer = EditorGUILayout.TextField("Answer", dialogGiver.dialogLines[i].answer);

    for (int e = 0; e < dialogGiver.dialogLines[i].dialogLines.Count; e++)
    {
        EditorGUILayout.LabelField("Line " + i + "/ Line " + e, EditorStyles.boldLabel);
    }
}

所以问题是,我如何使该循环查找与 DialogLine(以及该 DialogLine 中的 DialogLine 子项)一样多的子问题和子行。

这是 DialogLine 类:

public class DialogLine
{
    public string line;
    public string answer;

    /// <summary>
    /// This will enable the dialog giver to continue speaking of the same theme (use for long dialogs!)
    /// </summary>
    public List<DialogLine> dialogLines = new List<DialogLine>();
}

提前致谢,我愿意学习如何工作!

【问题讨论】:

  • 用 ForEach 代替 for,问题解决了。
  • 只需在包装器内添加一个指向 subs 的链接。所以你可以检查它是否有一个子,然后再次迭代它。您可以递归地执行此操作。

标签: c# list loops dialog infinite


【解决方案1】:
    public void RecursiveMethod(List<DialogLine> list)
    {
         for(int i = 0; i < list.Count; i++)
         {
               EditorGUILayout.LabelField("Line " + i, EditorStyles.boldLabel);

               list[i].line = EditorGUILayout.TextField("Question", list[i].line);
               list[i].answer = EditorGUILayout.TextField("Answer", list[i].answer);
               RecursiveMethod(list[i].dialogLines);
         }
    }

做得很快。但它应该是这样的。它将继续遍历所有子节点,直到遇到一个空列表 ofcourse。

祝你好运!

【讨论】:

  • 嘿!感谢您的快速评论!尽管我使用了@C Sharper 显示的示例,但我完全明白了这个想法:D
  • 你更喜欢被喂而不是指向正确的方向。
  • 实际上我最终还是使用了您的示例
  • 没问题,很高兴能帮上忙 :) 我也讨厌大脑*****
【解决方案2】:

创建一个附加属性以确定是否有任何子Dialogline。 现在你可以使用递归了:(未测试)

public List<DialogLine> GetAllDialogLines(DialogLine rootDialogLine)
{
   List<DialogLine> allLines = new List<DialogLine>();

   if(rootDialogLone.HasChilds)
   {
      GetAllDialogLines(rootDialogLine, allLines);
   }
   else
   {
      allLines.Add(rootDialogLine);
   }

   return allLines;
}

private void GetAllDialogLines(List<DialogLine> dialogLines, List<DialogLine> result)
{

   foreach(var dl in  dialogLines)
   {
      result.Add(dl); 

   if(dl.HasChilds)
   {
       GetAllDialogLines(dl, result);
   }
   }  
}


public class DialogLine
{
    public string line;
    public string answer;

    public bool HasChilds
    {
         get {return dialogLines.count > 0;}
    }

    /// <summary>
    /// This will enable the dialog giver to continue speaking of the same theme (use for long dialogs!)
    /// </summary>
    public List<DialogLine> dialogLines = new List<DialogLine>();
}

【讨论】:

  • 好人,感谢您的快速响应,我完全回到了正轨^^
猜你喜欢
  • 2022-11-18
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
相关资源
最近更新 更多