List.First ничего не возвращает, пока есть что-то

1

Я делаю что-то вроде объективного списка с С#. Я получил его работу и все, способный нарисовать объективный список внутри 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(); внутри класса.

Это класс целей:

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
    Где ваша настоящая ошибка? Опишите плохое поведение и то, что вы ожидаете увидеть. Кроме того, как определяются цели.
  • 0
    Там нет фактической ошибки. Просто он ничего не находит, пока что-то есть. Цели просто определяются как List<Objective> objectives = new List<Objective>(); внутри класса.
Показать ещё 5 комментариев
Теги:
unity3d

1 ответ

2
Лучший ответ

Возможно, вам понадобится реализовать что-то вроде IEquatable внутри вашего класса Objective. Вы просите компьютер проверить, содержит ли ObjectiveName shortObj, но он не знает, как сделать это сравнение. ObjectiveName строка? Список строк? a (n) Объективный класс? Если это список строк, которые мы называем "объективными именами", то ожидаемым элементом будет строка (что-то вроде shortObj.ObjectiveName, предполагающее, что строка). Если ObjectiveName - это список классов Objective, и вы спрашиваете, содержит ли этот список определенный объект Objective, называемый shortObj, тогда вам нужно реализовать IEquatable в своем классе Objective.

EDIT В свете последних комментариев попробуйте что-то вроде:

var value = objectives.AsEnumerable().Where(x => x.ObjectiveName == shortObj).FirstOrDefault();
  • 0
    ObjectiveName - это простая строка.
  • 0
    хорошо, в этом случае вам понадобится что-то вроде: var value =jectives.First (x => x.ObjectiveName == shortObj.ObjectiveName); Сейчас я точно не знаю, какая часть класса Objective содержит имя, поэтому я просто предположил, что это Objective.ObjectiveName. Дайте мне знать, если Objective может содержать несколько имен объективов, потому что, когда нам может понадобиться изменить его: x => shortObj.ListofObjectiveNames.Contains (x.ObjectiveName) ...
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню