C# 如何遍历子列表中的所有列表?
C# How to iterate throught all the lists in child's list?
所以我已经停止解决这个问题,我想不出哪个解决方案,虽然我想我在另一个项目上做了同样的事情,但我现在已经忘记了这个问题,但是我丢失了文件..
事实是,我正在编写一个对话系统,它有一个答案行和最多 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 class:
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>();
}
提前致谢,我愿意学习这应该如何工作!
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。
祝你好运!
再创建一个属性以确定是否有childDialogline
。
现在你可以使用递归了:(未测试)
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>();
}
所以我已经停止解决这个问题,我想不出哪个解决方案,虽然我想我在另一个项目上做了同样的事情,但我现在已经忘记了这个问题,但是我丢失了文件..
事实是,我正在编写一个对话系统,它有一个答案行和最多 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 class:
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>();
}
提前致谢,我愿意学习这应该如何工作!
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。
祝你好运!
再创建一个属性以确定是否有childDialogline
。
现在你可以使用递归了:(未测试)
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>();
}