C # Как реализовать метод Equal() в массиве циклов for?

#c# #arrays #inheritance #methods #equals

#c# #массивы #наследование #методы #равно

Вопрос:

У меня есть метод Equal (), чтобы увидеть, был ли уже введен порядковый номер или нет. Я не уверен, как вызвать его во время массива циклов for.

Это мой метод Equal

 public override bool Equals(object e)
    {
        bool equal;
        Order temp = (Order)e;
        if(OrderNumber == temp.OrderNumber)
            equal = true;
        else
            equal = false;
        return equal;
    }
  

И это входная часть main()

 public class week_6
{
public static void Main(string[] args)
{
    ShippedOrder[] InputOrder = new ShippedOrder[5];
    int x;
    for(x= 0; x < InputOrder.Length;   x)
    {
    InputOrder[x] = new ShippedOrder();


    Console.Write("Enter order number:  ");
    InputOrder[x].OrderNumber = Convert.ToInt32(Console.ReadLine());
    Console.Write("Enter customer name:  ");
    InputOrder[x].CustName = Console.ReadLine();
    Console.Write("Enter quantity:  ");
    InputOrder[x].Quantity = Convert.ToInt32(Console.ReadLine());
    } 
  

Класс SippedOrder является дочерним классом класса Order. Программа компилируется и работает нормально, не пытаясь что-либо сделать с помощью метода equals.

Я пытаюсь сделать так, чтобы, если они помещают один и тот же номер заказа, он сообщал: «Извините, номер заказа ‘###’ является дубликатом. Пожалуйста, повторите ввод»

Любая помощь была бы очень признательна

Комментарии:

1. не могли бы вы, пожалуйста, яснее сформулировать свой вопрос? О какой части вы спрашиваете? Как переопределить Equals() метод и использовать его, чтобы определить, следует ли отправлять пользователю сообщение консоли? Или вы спрашиваете, как разорвать цикл, когда обнаружите, что тот же порядок был введен с использованием вашего Equals() переопределения?

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

3. Убедитесь, что вы также переопределяете, GetHashCode если вы переопределяете Equals . Это будет особенно важно, если вы решите использовать HashSet для отслеживания предыдущих заказов. Смотрите msdn.microsoft.com/en-us/library/336aedhh.aspx

Ответ №1:

Вы можете попробовать использовать HashSet<ShippedOrder> вместо массива. И использовать этот Add() метод. Если Add() возвращает false, вы можете отобразить свое сообщение «Извините, номер заказа ‘###’ является дубликатом. Пожалуйста, повторите ввод»

Редактировать:

 HashSet<ShippedOrder> InputOrder = new HashSet<ShippedOrder>();
  

и вы можете добавлять в него элементы следующим образом.

 ShippedOrder order  = new ShippedOrder();
order.OrderNumber = 1;
order.CustName = "Foo";
order.Quantity = 10;

bool result = InputOrder.Add(order);

if (!result)
{
   // add failed; display message
   ...
}
  

Комментарии:

1. Спасибо, я довольно новичок в c # и методах equal / gethash. Как бы я внедрил HashSet<ShippedOrder> в свой код?

2. @Joel смотрите мою правку. Кроме того, на странице MSDN есть пример, и вы всегда можете поискать другие примеры для HashSet.

Ответ №2:

Этот запрос linq может сработать.

 var isDupe = InputOrder.Where(o => o.Equals(InputOrder[x])).Count() > 1;
  

Комментарии:

1. Если вам нужно только одно совпадение, .Any() предпочтительнее использования Count(), так как Any остановится при первом совпадении и также понятнее 🙂

2. Да, но я ищу два или более совпадений.

3. Спасибо за помощь, как бы мне добавить это в forloop?

4. Поместите его в любое место цикла for и выполните его с помощью инструкции if. Если значение IsDupe равно true, выведите свое предупреждающее сообщение и выйдите из цикла.