Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从用户输入创建构造函数时不允许类的重复值_C# - Fatal编程技术网

C# 从用户输入创建构造函数时不允许类的重复值

C# 从用户输入创建构造函数时不允许类的重复值,c#,C#,我有一个jobs类,它有一个值叫做job number。我希望在创建该值的实例时,该值不允许重复。我尝试的是在for循环中执行,并用直接输入的内容检查过去对象的值,但我不相信这将准确确定以前是否使用过该数字。它实际上也不会比较,因为我在之后才启动实例 Job[] jobs = new Job[3]; //take user input, construct Job and save to array for (int i = 0; i < 3; i++) { Console.

我有一个jobs类,它有一个值叫做job number。我希望在创建该值的实例时,该值不允许重复。我尝试的是在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);
 }
Job[]jobs=新作业[3];
//获取用户输入,构造作业并保存到数组
对于(int i=0;i<3;i++)
{
Console.WriteLine(“输入作业编号”);
int num=Convert.ToInt32(Console.ReadLine());
而(num==jobs[i-1].GetHashCode()///GetHashCode只返回作业编号
{
Console.WriteLine(“对不起,作业编号“+num+”是重复的。\n请重新输入:”;
num=Convert.ToInt32(Console.ReadLine());
}
作业[i]=新作业(数量、名称、描述、小时);
}

我真的不知道还能做些什么,我想我可以将输入的每个num值保存到一个数组中并进行检查,但是有没有更优雅的方法来检查输入的pass值呢

我的一般建议是不要处理这个问题。您是否可以只添加一个进程内数据库,它的表中可以有一个正在运行的JobID作为主键?它可以进行独特的检查,自动值更可靠。对比赛条件有抵抗力。您所需要的只是插入输出语法

如果你不能使用ELSE代码来做这件事,那么有很多事情要考虑。

  • 斯皮德:通常我不会提及。但是,在很多这样的情况下,每创造一个新的就业机会,你都会很快花费大量的时间。“流动号码”可能更好。但有一个小的共济失调的危险(一个真正的低数字工作没有完成之前,数字是回来的)
  • 内存:只有一个这样的作业列表很有可能导致内存泄漏,因为你永远不会清除它。因此,您必须确定,一旦完成,一个作业将从列表中删除
  • 比赛条件。我假设这将在多任务或多线程环境中运行。在这一点上,你必须考虑竞争条件。检查和添加必须被包装成一个“lock”语句。理想情况下,还可以将列表变量标记为“volatile”,以避免出现一系列危险的优化
  • 你真的需要它吗?这很可能是一场灾难。如果您只是想要明确的“任务”,那么tasks类通常就是这样。也许你只是越来越相信这是保证独特性/身份的唯一方法?特别是如果您可以将的实际处理交给线程池,它应该是高效的

由于这是一门课程,我不想对程序的格式做太多改变,但我还是想出了这个简单的解决方案

        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;
int[]nums=newint[3];
对于(int i=0;i<3;i++)
Console.WriteLine(“输入作业编号”);
int num=Convert.ToInt32(Console.ReadLine());
while(nums.Contains(num))
{
Console.WriteLine(“对不起,作业编号“+num+”是重复的。\n请重新输入:”;
num=Convert.ToInt32(Console.ReadLine());
}
nums[i]=num;

正如Joseph的链接所建议的,将作业放入一个通用的作业字典中,并检查
作业编号。ContainsKey(num)
您可能也希望将其设置为
静态的
,以便只保留一个副本。可能是GUID?他们真的很丑。