2015-04-01 173 views
1

我正在用C#做一个像客观列表的东西。 我得到了它的所有工作,能够在Unity内绘制客观列表,并与他们一起制定新的目标。我对如何删除一些东西有一个想法,我用System.Linq和List.First函数来搜索它。但它似乎并不奏效。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.) 
    } 

然后在另一个班级,我有一个新的目标,就像这样。

​​

(我还包含一个objectiveID方法,但我省略了方便。)

在同一班级,当玩家完成某事,我有这个。

GameController.gameController 
    .GetComponent<GameController>() 
    .FinishObjective("foo"); //This has two possible methods, 
           the object ID (if defined) or the name of the objective. 

怎么回事,我做错了什么,我该怎么办才能解决这个问题? 感谢您的帮助。

编辑: 没有实际的错误。只是它没有找到任何东西,而有些东西。目标很容易定义为List objectives = 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

哪里是你的实际的错误?描述不良行为和你期望看到的。另外,如何定义目标。 – 2015-04-01 19:29:53

+0

没有实际的错误。只是它没有找到任何东西,而有些东西。目标很容易定义为'List goals = new List ();'在课堂内部。 – Stepepper 2015-04-01 19:41:07

+0

如果First没有找到某个东西,那么在调用'value.objectiveDescription'时应该会发生异常。呼叫'First'后'value'是什么? – 2015-04-01 19:42:44

回答

2

您可能需要实现类似IEquatable你的目标类中。您要求计算机检查ObjectiveName是否包含shortObj,但它不知道如何进行此比较。 ObjectiveName是一个字符串?字符串列表? (n)目标课程?如果它是我们称之为“目标名称”的字符串列表,那么期望的元素将是一个字符串(类似shortObj.ObjectiveName,假设它是一个字符串)。如果ObjectiveName是一个Objective类的列表,并且您在问这个列表是否包含一个名为shortObj的特定Objective元素,那么您需要在您的Objective类中实现IEquatable。

编辑 在最近的评论光,你可以试试:

var value = objectives.AsEnumerable().Where(x => x.ObjectiveName == shortObj).FirstOrDefault(); 
+0

ObjectiveName只是一个简单的字符串。 – Stepepper 2015-04-01 19:36:04

+0

好的,在这种情况下,您会想要类似于: var value = objectives.First(x => x。ObjectiveName == shortObj.ObjectiveName); 我现在没有确切地知道Objective类的哪个部分包含名称,所以我只是假定它是Objective.ObjectiveName。让我知道,如果Objective可以保存多个目标名称,因为当我们可能需要将其颠倒时:x => shortObj.ListofObjectiveNames.Contains(x.ObjectiveName)... – Lukas 2015-04-01 19:54:09

+0

ah shortObj也只是一个字符串。 – Stepepper 2015-04-01 20:04:23