正在检查数组中是否有重复的对象-Equals()或Method

本文关键字:-Equals 对象 Method 检查 数组 是否 | 更新日期: 2023-09-27 17:59:06

我正在自学C#,并且一直在练习。我需要确保没有重复的订单号输入到我的订单数组中。我认为这个练习的想法是使用Equals(),然而,我不知道如何让它发挥作用。我还没有学到什么太花哨的东西。Equals()会比使用方法更好吗?此外,我不知道如何调用该方法,所以我看到了true或false值。若发现重复,它应该循环并要求用户重新输入。提前感谢你,因为我真的很沮丧。。。我真的需要一个导师!

class Program
{
    static void Main()
    {
        Order[] order = new Order[3];
        int orderNumber;  // hold temp value until object is created
        string customerName;
        int qtyOrdered;
        for (int x = 0; x < order.Length; ++x) //to fill array
        {
            Console.Write("Enter Order Number: ");
            int.TryParse(Console.ReadLine(), out orderNumber); // put order number in temp
            if (order[x] != null) 
            {
                if (IsOrderNumberInUse(orderNumber, order) == true)
                {
                    Console.WriteLine("Duplicate order number");
                }
            }
                GetData(out customerName, out qtyOrdered);
                order[x] = new Order(orderNumber, customerName, qtyOrdered);
        }
        Console.ReadLine();
    }
   //METHOD TO CHECK FOR DUPLICATES
    private static bool IsOrderNumberInUse(int orderNumber, Order[] orders)
    {
        foreach (Order order in orders)
        {
            if (order.OrderNumber == orderNumber)
            {
                return true;
            }
        }
        // If orderNumber was not found
        return false;
    }
    static void GetData(out string customerName, out int qtyOrdered)
    {
        //Console.Write("Enter Order Number: ");
        //int.TryParse(Console.ReadLine(), out orderNumber);
        Console.Write("Enter Customer Name: ");
        customerName = Console.ReadLine();
        Console.Write("Enter Quantity Ordered: ");
        int.TryParse(Console.ReadLine(), out qtyOrdered);
    }
    class Order
    {
        private const double PRICE = 19.95;
        public int OrderNumber { get; set; }
        public string CustomerName { get; set; }
        public int QtyOrdered { get; set; }
        public double totalPrice
        {
            get
            {
                return QtyOrdered * PRICE;
            }
        }
        public Order(int orderNumber, string customer, int qty)  // Constructor
        {
            OrderNumber = orderNumber;
            CustomerName = customer;
            QtyOrdered = qty;
        }
        public override string ToString()
        {
            return ("'n" + GetType() + "'nCustomer: " + CustomerName + "'nOrder Number: " + OrderNumber +
                "'nQuantity:  " + QtyOrdered + "'nTotal Order:  " + totalPrice.ToString("C2"));
        }
        public override bool Equals(object x)
        {
            bool isEqual;
            if (this.GetType() != x.GetType())
                isEqual = false;
            else
            {
                Order temp = (Order)x;
                if (OrderNumber == temp.OrderNumber)
                    isEqual = true;
                else
                    isEqual = false;
            }
            return isEqual;
        }
        public override int GetHashCode()
        {
            return OrderNumber;
        }
    }
}

我尽量不使用列表,因为我已经学会了它们,我接下来的两个练习与这个练习有关。我担心如果我使用列表,我会更加失落。我得到了零错误,需要帮助修复它们。这是我的密码。使用Equals会比我目前正在努力解决的方法更好吗?谢谢你的耐心。。。

    class Program
{
    static void Main()
    {
        Order [] orders  = new Order [3];
        int tempOrderNumber;
        string tempCustomerName;
        int tempQtyOrdered;
        for (int x = 0; x < orders.Length; ++x)  // fill list
        {
            tempOrderNumber = AskForOrderNumber(orders);
            GetData(out tempCustomerName, out tempQtyOrdered);
            orders[x] = new Order(tempOrderNumber, tempCustomerName, tempQtyOrdered);
        }
        Console.ReadLine();
    }
    private static int AskForOrderNumber(Order [] orders)
    {
        int tempOrderNumber;
        Console.Write("Enter Order Number: ");
        int.TryParse(Console.ReadLine(), out tempOrderNumber);
            if (orders[0] !=null && IsOrderNumberInUse(tempOrderNumber, orders) == true) //Check for duplicates
            {
                Console.WriteLine("Duplicate order number");
                AskForOrderNumber(orders);
            }
            return tempOrderNumber;
    }
    static void GetData(out string tempCustomerName, out int tempQtyOrdered)
    {
        Console.Write("Enter Customer Name: ");
        tempCustomerName = Console.ReadLine();
        Console.Write("Enter Quantity Ordered: ");
        int.TryParse(Console.ReadLine(), out tempQtyOrdered);
    }
    private static bool IsOrderNumberInUse(int tempOrderNumber, Order[] orders)
    {
        foreach (Order order in orders)
            {
            if (order.OrderNumber == tempOrderNumber)
                {
                    return true;
                }
            }
            return false;
    }
    class Order
    {
        private const double PRICE = 19.95;
        public int OrderNumber { get; set; }
        public string CustomerName { get; set; }
        public int QtyOrdered { get; set; }
        public double totalPrice
        {
            get
            {
                return QtyOrdered * PRICE;
            }
        }
        public override string ToString()
        {
            return ("'n" + GetType() + "'nCustomer:  " + CustomerName + "'nOrder Number:  " + OrderNumber +
                "'nQuantity:  " + QtyOrdered + "'nTotal Order:  " + totalPrice.ToString("C2"));
        }
        public Order(int orderNumber, string customerName, int qtyOrdered)
        {
            OrderNumber = orderNumber;
            CustomerName = customerName;
            QtyOrdered = qtyOrdered;
        }
        public override bool Equals(Object x)
        {
            bool isEqual;
            if(this.GetType() != x.GetType())
                isEqual = false;
            else
            {
                Order temp = (Order) x;
                if(OrderNumber == temp.OrderNumber)
                    isEqual = true;
                else
                    isEqual = false;
            }
            return isEqual;
        }
        public override int GetHashCode()
        {
            return OrderNumber;
        }   
    }
}

正在检查数组中是否有重复的对象-Equals()或Method

为了解决您的问题,我建议您使用List<Order>,因为列表可以调整大小,我相信它们在这里会是更好的选择。

您当前的方法不起作用,因为您直到之后才创建order[x]

使用列表/固定代码

您应该使用临时orderNumber,但是,由于数组是空的,在第一次检查时也可能会出现null错误(可以修复),因此我再次建议使用List。

List<Order> orders = new List<Order>(); //Orders list
int orderNumber; //Temporary order number
string customerName; //Temporary customer name 
int qtyOrdered; //Temporary quantity
for (int x = 0; x < 3; ++x) //Fill List
{
    Console.Write("Enter Order Number: ");
    int.TryParse(Console.ReadLine(), out orderNumber); //Parse order number
    if (IsOrderNumberInUse(orderNumber, orders) == true) //Check for duplicates
    {
        Console.WriteLine("Duplicate order number");
    }
    //Get data and add to list
    GetData(out customerName, out qtyOrdered);
    orders.Add(new Order(orderNumber, customerName, qtyOrdered));
}
Console.ReadLine();

再次询问用户输入是否无效

上面的示例显示了我的建议,以解决您的问题并使用List,但如果您想进一步提示用户重新输入它的值,则正在使用中。您可以通过创建一个方法来请求用户输入,并通过递归在使用时再次请求用户。

...
for (int x = 0; x < 3; ++x) //Fill List
{
    orderNumber = AskForOrderNumber(orders);
    //Get data and add to list
    GetData(out customerName, out qtyOrdered);
    orders.Add(new Order(orderNumber, customerName, qtyOrdered));
    }
    Console.ReadLine();
}
private static int AskForOrderNumber(List<Order> orders)
{
    int orderNumber;
    Console.Write("Enter Order Number: ");
    int.TryParse(Console.ReadLine(), out orderNumber); //Parse order number
    if (IsOrderNumberInUse(orderNumber, orders) == true) //Check for duplicates
    {
        Console.WriteLine("Duplicate order number");
        AskForOrderNumber(orders);
    }
    return orderNumber;
}

验证检查的更好方法

您当前检查重复项的方法也没有错,但可以使用LINQ进行改进。(using System.LINQ

private static bool IsOrderNumberInUse(int orderNumber, List<Order> orders)
{
     return orders.Any(o => o.OrderNumber == orderNumber);
}