我正在使用C#制作类似客观列表的内容。
我完成了所有工作,能够在Unity中绘制目标列表,并用它们制定新的目标。我知道如何删除某些内容,我使用System.Linq
和List.First函数来搜索它。但它似乎没有用。
这是“完成和创建目标”代码。
public void NewObjective(string objectiveText, string objName)
{
objectives.Add(new Objective(objectiveText, objName)); //Add to the list Objective.
middleText("New Objective: " + objectiveText); //Display text on screen.
}
public void FinishObjective(string shortObj)
{
var value = objectives.First(x => x.ObjectiveName.Contains( shortObj ));
string completedTask = value.objectiveDescription;
middleText("Completed Objective: " + completedTask); //Display text on screen.
objectives.Remove(value); //Remove value. (Which doesn't find anything for some reason, so it can't delete anything from the list.)
}
然后在另一堂课中,我有一个新的目标,就像这样。
GameController.gameController
.GetComponent<GameController>()
.NewObjective("Foobar.", "foo"); //First is the Quest description,
and the second is the name for easy deletion.
(我还添加了一个objectiveID
方法,但我省略了。)
在同一个班级中,当玩家完成某些事情时,我就有了这个。
GameController.gameController
.GetComponent<GameController>()
.FinishObjective("foo"); //This has two possible methods,
the object ID (if defined) or the name of the objective.
发生了什么,我做错了什么,我该怎么做才能解决这个问题? 谢谢你的帮助。
修改 没有实际错误。它只是它找不到任何东西,而有东西。目标很容易定义为List targets = new List();在课堂内。
这是目标类:
public class Objective : MonoBehaviour
{
public string objectiveDescription;
public string ObjectiveName;
public int ObjectiveID;
public Objective(string objective, string objectiveName)
{
objectiveDescription = objective;
ObjectiveName = objectiveName;
}
public Objective(string objective, string objectiveName, int objectiveID)
{
objectiveDescription = objective;
ObjectiveName = objectiveName;
ObjectiveID = objectiveID;
}
}
答案 0 :(得分:2)
您可能需要在Objective类中实现IEquatable之类的东西。您要求计算机检查ObjectiveName是否包含shortObj,但它不知道如何进行此比较。 ObjectiveName是一个字符串?字符串列表? a(n)目标类?如果它是我们正在调用的字符串列表&#34;目标名称&#34;那么期望的元素将是一个字符串(类似于shortObj.ObjectiveName,假设&#39是一个字符串)。如果ObjectiveName是Objective类的列表,并且您询问此列表是否包含名为shortObj的特定Objective元素,那么您需要将IEquatable实现到Objective类中。
修改强> 根据最近的评论,尝试类似:
var value = objectives.AsEnumerable().Where(x => x.ObjectiveName == shortObj).FirstOrDefault();