2015-04-01 242 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