我是C#语言的新手,我想弄清楚如何才能通过将购买的商品数量乘以然后设置好订购数量后的商品价格12.35来获取Quantity
属性来计算最终价格。
我在使用Equals()
方法时也遇到了问题。我正在尝试使用Equals()
方法根据其订单号比较2个订单,但是我在Visual Studio中收到一条警告,提示说'Order' overrides Object.Equals(object o) but does not override Object.GetHashCode()
。我该如何解决?
这是我的程序:
using System;
namespace Order
{
class Program
{
static void Main(string[] args)
{
// creating the orders
Order order1 = new Order(1, "Joe Bob", 2);
Order order2 = new Order(3, "Sally Bob", 4);
Order order3 = new Order(1, "Jimmy Bob", 5);
Console.WriteLine(order1.ToString() + "\n");
Console.WriteLine(order2.ToString() + "\n");
Console.WriteLine(order3.ToString() + "\n");
//checks for duplicates
CheckDuplicate(order1, order2);
CheckDuplicate(order2, order3);
CheckDuplicate(order1, order3);
}
// output for duplicates
public static void CheckDuplicate(Order firstOrder, Order secondOrder)
{
if (firstOrder.Equals(secondOrder))
{
Console.WriteLine("The two orders are the same!");
}
else
{
Console.WriteLine("The two orders are not the same!");
}
}
}
class Order
{
// setting properties
public int OrderNum { get; set; }
public string CustomerName { get; set; }
public double Quantity;
private readonly double Total;
// total price
public double GetTotal()
{
double itemPrice = 12.35;
double Total = Quantity * itemPrice;
return Total;
}
// equals to method
public override bool Equals(Object o)
{
bool isEqual = true;
if (this.GetType() != o.GetType())
isEqual = false;
else
{
Order temp = (Order)o;
if (OrderNum == temp.OrderNum)
isEqual = true;
else
isEqual = false;
}
return isEqual;
}
// default constructor
public Order(int OrderNum, string CustomerName, double Quantity)
{
this.OrderNum = OrderNum;
this.CustomerName = CustomerName;
this.Quantity = Quantity;
}
// returns final output
public override string ToString()
{
return ("Order Number : " + OrderNum) + "\n" + ("Customer name : " + CustomerName) + "\n" + ("Quantity Ordered : " + Quantity) + "\n" + ("Totatl Price : " + Total);
}
}
}
Total
声明为只读属性,并声明用于进行乘法数学运算的getter。public double Quantity;
public double Total {
get {
const double itemPrice = 12.35;
return Quantity * itemPrice;
}
}
覆盖Object.GetHashCode()很容易。如果两个项目相同,则应创建一个返回相同值的函数。当您使用OrderNum作为识别订单的唯一方法时。只需返回此即可完成工作。
public override int GetHashCode() { return this.OrderNum; }
public sealed class Order : IEquatable<Order>
{
// Properties & Fields
public int OrderNum { get; set; }
public string CustomerName { get; set; }
public double Quantity { get; set; }
public double ItemPrice { get; set; }
public double TotalPrice => Quantity*ItemPrice;
// Constructor
public Order(int orderNum, string customerName, double quantity, double itemPrice = 12.35)
{
this.OrderNum = orderNum;
this.CustomerName = customerName;
this.Quantity = quantity;
this.ItemPrice = itemPrice;
}
// Equality
/// <summary>
/// Equality overrides from <see cref="System.Object"/>
/// </summary>
/// <param name="obj">The object to compare this with</param>
/// <returns>False if object is a different type, otherwise it calls <code>Equals(Order)</code></returns>
public override bool Equals(object obj)
{
if (obj is Order order)
{
// Uses pattern matching when `obj` is of type `Order`
return Equals(order);
}
return false;
}
/// <summary>
/// Checks for equality among <see cref="Order"/> classes
/// </summary>
/// <param name="other">The other <see cref="Order"/> to compare it to</param>
/// <returns>True if equal</returns>
public bool Equals(Order other)
{
return OrderNum.Equals(other?.OrderNum);
}
/// <summary>
/// Calculates the hash code for the <see cref="Order"/>
/// </summary>
/// <returns>The int hash value</returns>
public override int GetHashCode()
{
return (17+23*OrderNum.GetHashCode());
}
// Display
public override string ToString()
{
return string.Join(Environment.NewLine, new string[] {
$"Order Number : {OrderNum}",
$"Customer name : {CustomerName}",
$"Item Price : {ItemPrice:F2}",
$"Quantity Ordered : {Quantity:F3}",
$"Total Price : {TotalPrice:F2}",
Environment.NewLine,
});
}
}
如下使用:
class Program { static void Main(string[] args) { // creating the orders List<Order> orders = new List<Order>(); orders.Add(new Order(1, "Joe Bob", 2)); orders.Add(new Order(3, "Sally Bob", 4)); orders.Add(new Order(1, "Jimmy Bob", 5)); Console.WriteLine("List of all orders."); foreach (var order in orders) { Console.WriteLine(order); } Console.WriteLine("Found the following duplicates."); // Code taken from: https://stackoverflow.com/a/18547390/380384 foreach (var item in orders.GroupBy((order) => order).Where(grp => grp.Count()>1)) { Console.WriteLine(item.Key); } } }
带输出
List of all orders. Order Number : 1 Customer name : Joe Bob Item Price : 12.35 Quantity Ordered : 2.000 Total Price : 24.70 Order Number : 3 Customer name : Sally Bob Item Price : 12.35 Quantity Ordered : 4.000 Total Price : 49.40 Order Number : 1 Customer name : Jimmy Bob Item Price : 12.35 Quantity Ordered : 5.000 Total Price : 61.75 Found the following duplicates. Order Number : 1 Customer name : Joe Bob Item Price : 12.35 Quantity Ordered : 2.000 Total Price : 24.70