2012-04-19 4 views
0

Я пытаюсь найти способ поиска и проверки массива при его заполнении. Я хочу использовать метод overloaded equals, который я создал из другого класса.Нужна помощь в проверке массива для дубликатов записей при заполнении

Здесь перегруженный равно метод в классе ордена общественного: IComparable

public override bool Equals(object obj) 
    { 

      Order temp = (Order)obj; 
     if (orderNumber == temp.orderNumber) 
      return true; 
     else 
      return false; 

    } 

в основном, я пытаюсь создать 2 массивы, так что я могу сравнить с 1 по другой и проверить дубликатов, как я прохожу с вложенным циклом, но он не работает. Он просто продолжает заполнение массива, как будто он никогда не видел второй цикл

public static void Main() 

    { 
    //Create an array of five ShippedOrder objects. 
     ShippedOrder[] myShippedOrder = new ShippedOrder[5]; 
     ShippedOrder[] checkDup = new ShippedOrder[5]; 

    //Prompt the user for values for each Orders object; do NOT allow duplicate order numbers and force the user to reenter 
    // the order when a duplicate order number is entered. 



      for (int x = 0; x < myShippedOrder.Length; ++x) 
      { 

       int y = 0; 
       myShippedOrder[x] = new ShippedOrder(); 
       checkDup[y] = new ShippedOrder(); 

       Console.Write("Please enter the order number for order {0}: ", x + 1); 
       checkDup[y].orderNumber = Convert.ToInt32(Console.ReadLine());    


       for (y = 0; y < checkDup.Length; ++y) 
       { 
        if (checkDup[y] != null && myShippedOrder[x].Equals(checkDup[y])) 
        { 
         Console.WriteLine("Sorry, this order number has already been entered, please try again"); 
         --x; 
         break; 
        } 
        else myShippedOrder[x].orderNumber = checkDup[y].orderNumber; 
       } 

       Console.Write("Please enter the customers name for order {0}: ", x + 1); 
       myShippedOrder[x].customerName = Console.ReadLine(); 

       Console.Write("Please enter the quantity that was ordered for order {0}: ", x + 1); 
       myShippedOrder[x].quantityOrdered = Convert.ToInt32(Console.ReadLine()); 

       myShippedOrder[x].totalPrice = myShippedOrder[x].quantityOrdered * PRICEEACH + ShippedOrder.SHIPFEE; 


     } 

какие-либо предложения о том, как использовать перегруженный равный метод в классе для того, чтобы помочь в поиске дубликатов orderNumbers, если они существуют, и удар назад в пользователь ввел неверный порядок и повторил попытку с этим местом в массиве?

+1

Почему бы не использовать словарь? Кроме того, в любое время, когда вы перегружаете Equals, вы также должны перегружать operator == и GetHashCode(). Имеются последствия перегрузки равных, рассмотренных, например, здесь: http://stackoverflow.com/questions/9709088/when-should-a-net-class-override-equals-when-should-it-not –

+0

Извините, я не опубликовал всю программу, но я перегрузил другие тоже. Я не думал, что это уместно для этого вопроса, поэтому я не опубликовал этот код. – programmerNOOB

ответ

1

Что здесь происходит, так это то, что вам нужно continue, когда пользователь вводит что-то неправильно.

Попробуйте это:

public static void Main() 

{ 
//Create an array of five ShippedOrder objects. 
    ShippedOrder[] myShippedOrder = new ShippedOrder[5]; 
    ShippedOrder[] checkDup = new ShippedOrder[5]; 

//Prompt the user for values for each Orders object; do NOT allow duplicate order numbers and force the user to reenter 
// the order when a duplicate order number is entered. 


     bool wronginput = false; 
     for (int x = 0; x < myShippedOrder.Length; ++x) 
     { 

      int y = 0; 
      myShippedOrder[x] = new ShippedOrder(); 
      checkDup[y] = new ShippedOrder(); 

      Console.Write("Please enter the order number for order {0}: ", x + 1); 
      checkDup[y].orderNumber = Convert.ToInt32(Console.ReadLine());    


      for (y = 0; y < checkDup.Length; ++y) 
      { 
       if (checkDup[y] != null && myShippedOrder[x].Equals(checkDup[y])) 
       { 
        Console.WriteLine("Sorry, this order number has already been entered, please try again"); 
        --x; 
        wronginput = true; 
        break; 
       } 
       else myShippedOrder[x].orderNumber = checkDup[y].orderNumber; 
      } 

      if(wronginput) 
       continue; 

      Console.Write("Please enter the customers name for order {0}: ", x + 1); 
      myShippedOrder[x].customerName = Console.ReadLine(); 

      Console.Write("Please enter the quantity that was ordered for order {0}: ", x + 1); 
      myShippedOrder[x].quantityOrdered = Convert.ToInt32(Console.ReadLine()); 

      myShippedOrder[x].totalPrice = myShippedOrder[x].quantityOrdered * PRICEEACH + ShippedOrder.SHIPFEE; 


    } 

как я добавил wronginput Обратите внимание, так что сразу после второго цикла, он бросает обратно в начало внешнего цикла.

Я думаю, что это то, что вы ищете прямо сейчас, хотя есть лучшие способы сделать то, что вы делаете, чтобы проверить наличие дубликатов.

+0

Черт возьми, я думаю, моя другая проблема заключается в том, что я получаю «Необработанное исключение: System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта». из этой строки "else myShippedOrder [x] .orderNumber = checkDup [y] .orderNumber;" – programmerNOOB

+0

@programmerNOOB; какая линия? – BeemerGuy

+0

это строка 118 в моем коде, но я не уверен, что это то, что я написал здесь. Я могу опубликовать все это, если это полезно? – programmerNOOB

Смежные вопросы