代码之家  ›  专栏  ›  技术社区  ›  jamheadart

添加到列表时创建新命名实例

c#
  •  1
  • jamheadart  · 技术社区  · 8 年前

    我有一门这样的基础课:

    public class task
        {
            public string tName;
            // Construct
            public job(string t)
            {
                tName = t;
            }
        }
    

    现在我可以做到:

    public class TASKCLASS
        {
    
            private task myTaskName1 = new task("name of task 1");
    
            public Dictionary<string, task> tasks = new Dictionary<string, task>();
    
            // Construct
            public TASKCLASS()
            {
                tasks.Add(myTaskName1.tName, myTaskName1);
            }
        }
    

    太好了,真管用!但是我有很多任务要添加到字典中-现在我知道我不能添加我的 tasks 直接在 .Add 像这样的部分:

    public class TASKCLASS
        {
    
            public Dictionary<string, task> tasks = new Dictionary<string, task>();
    
            // Construct
            public TASKCLASS()
            {
                tasks.Add("name of task 1", myTaskName1 = new task("name of task 1"));
            }
        }
    

    因为这个物体 myTaskName1 不存在,即使我试图在 .添加 线

    但我想知道是否有什么方法可以构建我的任务类,以便我可以用 tName 我的字典里有没有把它放在同一行,以防止在某一行出现干错误?

    想法:我能为我的工作字典创建一个新的方法吗? .添加 函数只需要 名称 以及 task 反对?

    编辑: 我想我可以用 任务 作为一个基类,派生出一堆我想要的名字。我可能可以循环浏览对象列表,并很容易地查看它们的属性,同时还可以随时按其名称调用每个实例。

    3 回复  |  直到 8 年前
        1
  •  1
  •   Ehz    8 年前

    您只需创建一个构造函数,它接受任务类的任务名称。此外,您还可以添加一个方法,将新任务添加到正在跟踪任务的类中的字典中。您可以从任务列表中创建第二个添加到字典中的方法。

    根据评论添加: 您可以添加常量,如果有特殊情况的任务,并且您担心它们的名称输入错误。

    您还可以从任务继承并创建具有保留名称的派生任务。但这意味着派生类将被限制在字典中的单个实例中。不过,我不确定这是否是你想要的。从基类继承来维护一个名称对我来说似乎太过分了。

    public class Task
    {
        //protected task name that can only be set in base or derived classes
        protected string name;
    
        //Property to return task name
        public string Name { get { return name; } }
    
        public Task() {
    
        }
    
        //Task contructor that requires a name value to be instantiated
        public Task(string name)
        {
            this.name = name;
        }
    }
    
    public class DerivedTask1 : Task
    {
        public static const string TASK_NAME = "Derived Task Name 1";
    
        public DerivedTask1() 
        {
            this.name = TASK_NAME;
        }
    }
    
    public class TaskTracker
    { 
        //Private dictionary to hold tasks
        private Dictionary<string, Task> tasks;
    
        public TaskTracker()
        {
            this.tasks = new Dictionary<string, Task>();
        }
    
        public void AddTask(Task task) {
            //Adds a task to the dictionary, note that there is no error checking and will fail when task with duplicate name is added
            this.tasks.Add(task.Name, task);
        }
    
        public void AddTasks(List<Task> newTasks)
        {
            //Adds all tasks in a list to the backing task dictionary
            foreach(Task task in newTasks)
            {
                AddTask(task);
            }
        }
    
        public Task GetTask(string taskName)
        {
            if (this.tasks.ContainsKey(taskName))
            {
                return this.tasks[taskName];
            }
            else
            {
                return null;
            }
        }
    }
    

    向集合中添加任务的代码示例:

    const string RESERVED_TASK_NAME_1 = "Reserved Task Name 1";
    const string RESERVED_TASK_NAME_2 = "Reserved Task Name 2";
    
    var tracker = new TaskTracker();
    tracker.AddTask(new Task("Task 1"));
    tracker.AddTask(new Task("Task 2"));
    
    var taskList = new List<Task>();
    taskList.Add(new Task(RESERVED_TASK_NAME_1));
    taskList.Add(new Task(RESERVED_TASK_NAME_2));
    
    tracker.AddTasks(taskList);
    
    var taskFromLookup = tracker.GetTask(RESERVED_TASK_NAME_1);
    
    tracker.AddTask(new DerivedTask1());
    var otherTaskFromLookup = tracker.GetTask(DerivedTask1.TASK_NAME);
    
        2
  •  1
  •   David Zemens    8 年前

    想法:我能为我的工作字典创建一个新的方法吗? .Add 函数只需要 tName 以及 task 反对?

    这有点问题。

    转让声明 myTaskName1 = new task("name of task 1") 返回一个void,因此即使可以在封闭范围内的封闭范围内创建变量实例,字典最终也不会有 Values 是的。这可能不会打扰你,但显然你不能在变量存在之前引用它,这是你试图做的,同时增加了试图尝试的变量。 创造 在外部范围内的变量!

    如果您只是想从intellisense获得一些帮助来管理几十个或几百个表示特定类实例的字段/属性/变量,我认为您的问题是应用程序设计。你试图避免编写意大利面代码,这是令人钦佩的,但你仍然 思考 意大利面:D

    不过,简而言之,如果你有几十个或几百个“任务”变量,intellisense除了使用索引列表或键控字典来管理这些变量外,并不能真正帮助你。虽然你可以用反省和抽象类来做一些有趣的事情,但我不确定这会让你离你想要的更近,甚至会让事情变得更糟!

    只要提出另一个选项,你可以用 enum ,例如:

    mytasks.cs:我的任务:

        public enum MyTasks
        {
            taskName1,
            taskName2,
            taskName3,
            taskName4,
            taskName5,
            taskName6 // Etc...
        }
    

    任务栏.cs

    public class TaskDict: Dictionary<MyTasks, Task>
    

    如果您总是需要某些默认任务,那么只需将构造函数方法添加到 TaskDict 以下内容:

        public TaskDict()
        {
            Add(MyTasks.taskName1, new Task("name of task 1"));
            Add(MyTasks.taskName2, new Task("name of task 2"));
            Add(MyTasks.taskName3, new Task("name of task 3"));
            // etc.
        }
    

    如你所见, 任务指令 一本字典是根据 MyTasks 枚举,具有 Task 值中的实例。

    任务.cs

    public class Task
    {
        string tName;
        public Task(string taskName)
        {
            tName = taskName;
        }
        public void PrintName()
        {
            Console.WriteLine(tName);
        }
    
    }
    

    现在在你的跟踪器课上,新的 任务指令 作为属性/字段:

    任务跟踪程序.cs

    public class TaskTracker
    {
        public TaskDict Tasks = new TaskDict();
    
        public TaskTracker()
        {
            // You could add tasks here if needed
            Tasks.Add(MyTasks.taskName5, new Task("the fifth task"));
            // Or remove them:
            Tasks.Remove(MyTasks.taskName1);
    
            _run();
        }
        private void _run()
        {
            foreach(MyTasks t in Tasks.Keys)
            {
                Tasks[t].PrintName();
            }
        }
    }
    
        3
  •  0
  •   jamheadart    8 年前

    我已经反复强调了这一点,实现我真正想要的方法实际上是用我所需要的所有函数创建一个抽象类,然后用我想要持久化并具有intellisense访问权限的名称创建派生的空类。

    因为它们只是派生出来的,所以如果有必要的话,我可以有一些额外的函数,特别是我的代码所在的工作…增加奖金!

    我想我只是还不习惯把每一件事都分解到课堂上-不确定这是在逐渐消失还是在吃意大利面,但让我们看看结果如何…