循环以防止重复输入到数组

时间:2017-11-11 17:32:34

标签: c# arrays loops

因此,对于我们的c#类,我们必须创建一个包含5个对象的数组,这些对象具有4个属性

作业号的int 作业名称的字符串
职位描述的字符串
预计工作时间的两倍。

我需要在循环中防止用户输入重复的作业号:这是我的代码到目前为止。此代码有效,但允许重复的作业号;

namespace JobDemo2
{
class Program
{
    static void Main(string[] args)
    {
        Job[] jobbies = new Job[5];
        int x;
        int jobNum;
        string customerName;
        string description;
        double hours;
        const double RATE = 45.00;

        for (x = 0; x < jobbies.Length; ++x)// creates array
        {
            GetJobData(out jobNum, out customerName, out description, out hours, jobbies);
            jobbies[x] = new Job(jobNum, customerName, description, hours);            
        }

        //Array.Sort(jobbies);
        Console.WriteLine("The jobs, sorted, are: ");
        for (x = 0; x < jobbies.Length; ++x) // prints the array values
        {
            DisplayJobs(jobbies[x]); 
        }

        double totalRevenue = (jobbies[0].Hours + jobbies[1].Hours + 
                 jobbies[2].Hours + jobbies[3].Hours + jobbies[4].Hours) * RATE;
        Console.WriteLine();
        Console.WriteLine("The total revenue projected is {0}", totalRevenue);

        Console.ReadKey();
    }

    static void GetJobData(out int jobNum, 
         out string customerName, out string description, out double hours, 
         Job[] jobbies)
    {                   
        string inString;

        Console.Write("Please enter a job number >> ");
        inString = Console.ReadLine();
        int.TryParse(inString, out jobNum);

        Console.Write("Please enter the customer's name for this job >> ");
        customerName = Console.ReadLine();

        Console.Write("Please enter the job's description >> ");
        description = Console.ReadLine();

        Console.Write("Please enter the projected hours for the job >> ");
        inString = Console.ReadLine();
        double.TryParse(inString, out hours);
        Console.WriteLine();
    }

    static void DisplayJobs(Job jobbies)
    {
        Console.WriteLine("{0, 5} {1, -10} {2, 6} {3, 8}", 
          jobbies.JobNumber, jobbies.Customer, jobbies.Description, jobbies.Hours);
    }
}

class Job //object
{
    private double hours;
    private double price;
    public const double RATE = 45.00;
    public Job(int num, string cust, string desc, double hrs)
    {
        JobNumber = num;
        Customer = cust;
        Description = desc;
        Hours = hrs;
    }
    public int JobNumber { get; set; }
    public string Customer { get; set; }
    public string Description { get; set; }
    public double Hours
    {
        get
        {
            return hours;
        }
        set
        {
            hours = value;
            price = hours * RATE;
        }
    }
    public double Price
    {
        get
        {
            return price;
        }
    }
    public override string ToString()
    {
        return (GetType() + " " + JobNumber + " " + Customer + " " +
           Description + " " + Hours + " hours @" + RATE.ToString("C") +
           " per hour. Total price is " + Price.ToString("C"));
    }
    public override bool Equals(Object e)
    {
        bool equal;
        Job temp = (Job)e;
        if (JobNumber == temp.JobNumber)
            equal = true;
        else
            equal = false;
        return equal;
    }
    public override int GetHashCode()
    {
        return JobNumber;
    }
}
}

老师建议班级我们在这里做另一个循环,比较对象。循环会是什么样的?

这是她的电子邮件:

  

帮助循环创建一个布尔变量   for循环遍历数组,要求用户输入info并将bool变量设置为true。

     

另一个for循环内部调用类中的equals方法,该方法将刚刚输入的作业与数组中的每个对象进行比较。这是大多数人搞乱的地方,因为您必须将对象与对象进行比较,而不是将作业编号的整数与整个对象进行比较。如果对象相等则将bool设置为false。

     

当bool是假的时候你想告诉他们他们输入了错误的号码并再次输入。在这里将bool设置为true,然后再循环再次进行比较。只要数字保持为假,用户就会卡在此循环中。当他们输入正确的数字时,它就会爆发。

1 个答案:

答案 0 :(得分:1)

这是家庭作业,所以我只给你一些指示:

  1. 不要将存储作业的数组(lapply(split(lst, sub("\\d+$", "", names(lst))), function(x) rbindlist(x)[, .(freq = sum(freq)), ID]) #$`01_001_F08_S80_L` # ID freq #1: 16S_rRNA_copy_A-1 173 #2: 16S_rRNA_copy_B-1 182 #3: 16S_rRNA_copy_C-1 203 #$`01_001_F09_S81_L` # ID freq #1: 16S_rRNA_copy_A-1 494 #2: 16S_rRNA_copy_B-1 497 #3: 16S_rRNA_copy_C-1 624 )交给gplot(df,aes(GAME_DATE,DEF_RATING)) + geom_line(aes(y=rollmean(df$DEF_RATING,9, na.pad = TRUE))) + geom_line(aes(y=rollmean(df$OFF_RATING,9,na.pad = TRUE)),color='steelblue') + scale_x_date(date_labels="%b",breaks=seq(min(df$GAME_DATE),max(df$GAME_DATE), "1 month")) 。这种方法应该只有一个问题:获取工作数据。确定数据是否有重复jobbies并不是它的关注点。

  2. 编写一个检查重复项的帮助方法。它需要什么?它需要以前的所有工作,有多少工作,以及需要验证的新工作。以下签名看起来是正确的:

    GetJobData

    这种方法有什么作用?好吧,它只需要遍历Id中的第一个private static bool CheckIfNewJobIsValid(Job newJob, Job[] jobs, int jobsValidatedCount) 作业,并检查jobsValidatedCount是否等于它们中的任何一个。如果是,请挽救返回jobs。如果循环结束,那么您可以返回newJob,找不到匹配项。

  3. false不需要成为新的计数器,代码中的其他已存在的变量可能已经为您提供了这些信息。

  4. 祝你好运!

    Pd积。因为这已经由您的老师传下来了,我会稍微解决一下true方法:

    jobsValidatedCount

    Pd积。正如阿列克谢·莱文科夫在评论中指出的那样,使用Equals ony public override bool Equals(Object e) { bool equal = false; Job temp = e as Job; if (Job != null && JobNumber == temp.JobNumber) { equal = true; } return equal; } 比较表似乎是一个坏主意。不管所有其他属性的值如何,任何两个具有相同Equals的作业是否真的相等?至少可以说这可能令人困惑。更好的方法是直接检查JobNumberJobNumber而不使用JobNumber,但我猜它的使用是出于学术原因。