【问题标题】:How can I change the state of my Task in a list?如何更改列表中任务的状态?
【发布时间】:2021-12-02 11:31:33
【问题描述】:

我正在尝试在 C# 中创建一个 todo 应用程序。我想要做的是能够以某种方式将任务标记为已完成。有谁知道怎么做?

这是我的程序类,我在 foreach 中打印出列表:

using System;

namespace ToDo
{
    class Program
    {
        static void Main(string[] args)
        {
            bool isRunning = true;

            var collection = new TodoCollection();


            while (isRunning)
            {
                var menu = new menu();
                menu.Title();
                menu.Options();
                int choices;
                choices = Convert.ToInt32(Console.ReadLine());
                switch (choices)
                {
                    case 1:
                        var inputNewTask = Console.ReadLine();
                        var task = new Task(inputNewTask, false);
                        collection.Add(task);
                        Console.Clear();
                        Console.ReadLine();
                        break;
                    case 2:
                        int counter = 0;
                        if (collection != null)
                        {
                            
                            Console.WriteLine("Dagens uppgifter listas här nedanför");
                            foreach (Task newTask in collection)
                            {
                                counter++;
                                Console.WriteLine($"({counter}) [] {newTask.ShowTask()}");
                            }
                            int userInput = Convert.ToInt32(Console.ReadLine());
                            Task selectedTask = collection.GetTask(userInput);
                            selectedTask.Done();
                            


                        }
                        break;
                }
            }

        }
    }
}

在我的 foreach 循环中有一个空方括号,我想通过用户输入将其更改为“X”。

这是我的 Todo 集合的类,其中包含我的列表:

using System.Collections;
using System.Collections.Generic;

namespace ToDo
{
    public class TodoCollection : IEnumerable<Task>
    {
        //Deklarerar mina fält
        List<Task> _CurrentTasks = new List<Task>();
        

   
        //Funktion som låter användaren läga till nya tasks i listan
        public void Add(Task NewTask)
        {
            _CurrentTasks.Add(NewTask);
        }
        public Task GetTask(int userInput)
        {
           return _CurrentTasks[userInput];

        }

        //Låter mig iterera igenomm listan _CurrentTasks
         public IEnumerator<Task> GetEnumerator()
        {
            return ((IEnumerable<Task>)_CurrentTasks).GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return ((IEnumerable)_CurrentTasks).GetEnumerator();
        }
    }
}
``´
 

我也在这里为我的任务开设了一门课:

namespace ToDo
{
    public class Task
    {
        string _Name;
        bool isDone = false;
        public Task(string name, bool done)
        {
            this._Name = name;
            this.isDone = done;
        }

        public string ShowTask()
        {
            return this._Name;
        }
        public bool Done()
        {
            isDone = true;
            return isDone;
        }
    }
}

【问题讨论】:

  • 您当前的程序不起作用怎么办?您已经阅读了用户输入并对其进行处理以将任务设置为完成。请注意,控制台应用程序不会产生对用户最友好的待办事项应用程序...
  • 是的,我知道。但是我想这样做,如果用户在当前待办事项显示时按下例如“1”,我希望我的 consoole.WriteLine 中的括号用“X”标记
  • 如果您的意思是一种“交互”方式,控制台应用程序通常不适合这种用户交互。你可以模拟这个,见:stackoverflow.com/questions/60767909/…

标签: c# .net list console


【解决方案1】:

我假设选项 2 是“将任务标记为完成”,您打印出任务列表,然后询问用户将哪一项标记为完成:

                        Console.WriteLine("Dagens uppgifter listas här nedanför");
                        foreach (Task newTask in collection)
                        {
                            counter++;
                            Console.WriteLine($"({counter}) [] {newTask.ShowTask()}");
                        }
                        int userInput = Convert.ToInt32(Console.ReadLine());
                        Task selectedTask = collection.GetTask(userInput);
                        selectedTask.Done();

因为“打印任务列表”听起来像是我们经常想做的事情,所以我们应该把它变成一个方法:


    static void PrintListOfTasks(ToDoCollection what){
        foreach (Task newTask in what)
        {
            counter++;
            Console.WriteLine($"({counter}) [] {newTask.ShowTask()}");
        }
    }

如果任务完成,我们也让它显示一个 X,如果它没有完成,则显示一个空格:

 Console.WriteLine($"({counter}) [{newTask.IsDone() ? 'X' : ' '}] {newTask.ShowTask()}");

但是现在还有另一个问题:Task 没有办法判断它是否已完成,它只有一个 Done() 方法将其标记为已完成。你没有在任何地方使用过 c# 属性,所以我在这里的推荐中没有使用过;相反,我们可以创建一个只报告当前任务状态的方法。复制粘贴 Done() 方法并更改该对,以便现有单曲“将其标记为已完成并报告当前状态”(这有点荒谬,因为我们知道布尔值的状态如果我们只是将其标记为 true 则必须是)而是两种不同的方法,一种是 sets 值,另一种是 gets 值:

    public void MarkAsDone()
    {
        isDone = true;
    }
    public bool IsDone()
    {
        return isDone;
    }

现在您可以在 WriteLine 显示中使用 get 版本,并且可以在“将任务标记为已完成”菜单选项中使用您的 set 版本

最后,您可以调整执行选项 2 的循环,所以它的逻辑是:

  • PrintList(传入集合)
  • 询问用户将哪个标记为完成
  • 标记为完成
  • 再次打印列表以向用户确认已完成

【讨论】:

    猜你喜欢
    • 2011-02-05
    • 1970-01-01
    • 2014-07-19
    • 2022-01-27
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多