#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, выведите свое предупреждающее сообщение и выйдите из цикла.