List.First不返回任何东西,虽然有东西

时间:2015-04-01 19:22:42

标签: c# unity3d

我正在使用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;
    }
}

1 个答案:

答案 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();