从用户输入

时间:2018-03-25 03:52:20

标签: c#

我有一个有一个叫做工号的工作类。我希望这个值在我创建它的实例时不允许重复。我正在尝试的是在for循环中执行它并使用直接输入的内容检查过去对象的值但我不相信这将准确地确定该数字是否已被使用过。它也不会实际比较,因为我不会在

之后启动实例
Job[] jobs = new Job[3];

//take user input, construct Job and save to array
 for (int i = 0; i < 3; i++)
 {
    Console.WriteLine("Enter job number");
    int num = Convert.ToInt32(Console.ReadLine());

    while(num == jobs[i-1].GetHashCode()) // get hash code just returns job number
    {
        Console.WriteLine("Sorry, the job number " + num + "is a duplicate. \nPlease reenter: ");
        num = Convert.ToInt32(Console.ReadLine());
    }

        jobs[i] = new Job(num, name, description, hours);
 }

我真的不知道还能做什么我想我可以保存输入到数组中的每个num值并检查这种方式但是有更优雅的方法来检查输入的传递值吗?

2 个答案:

答案 0 :(得分:1)

因为这是一个我不想改变程序格式的课程,所以我确实提出了这个简单的解决方案。

        int[] nums = new int[3];
        for (int i = 0; i < 3; i++)

            Console.WriteLine("Enter job number");
            int num = Convert.ToInt32(Console.ReadLine());

            while (nums.Contains(num))
            {
                Console.WriteLine("Sorry, the job number " + num + " is a duplicate. \nPlease reenter: ");
                num = Convert.ToInt32(Console.ReadLine());
            }
            nums[i] = num;

答案 1 :(得分:0)

我的一般建议是不要处理这个问题。你有没有机会只添加一个进程内数据库,它可以将一个正在运行的JobID作为主表的主键吗?它可以做唯一检查,自动值更可靠。并且抵抗种族条件。您只需要INSERT OUTPUT语法。

如果您不能使用别人的代码来执行此操作,则需要考虑很多事项。

  • 速度:通常我不会提到它。但是,对于很多像这样的实例而言,很快就会花费大量时间来创建新的工作岗位。 “运行数”可能会更好。但是有一个很小的危险(一个真正的低数字工作没有在数字回来之前完成)。
  • 内存:拥有这样的单个作业列表有很大的危险导致内存泄漏,因为你永远不会清除它。因此,您必须确定一旦完成,就会从列表中删除作业。
  • 比赛条件。我认为这将在多任务或多线程环境中运行。在这一点上,你绝对必须考虑竞争条件。那个检查和补充啊要被包装成一个“锁”声明。理想情况下还要将List变量标记为“volatile”,以便将一堆危险的优化排除在外。
  • 你真的需要吗?这可能是XY problem。如果你只是想要无意义的“任务”,那么任务类通常就是这样。也许你刚才确信这是保证唯一性/身份的唯一方法?特别是如果您可以将执行处理交给ThreadPool,它应该是高效的。