【问题标题】:C# How do you implement an Equal() method in a for loop array?C# 如何在 for 循环数组中实现 Equal() 方法?
【发布时间】:2011-08-11 21:56:42
【问题描述】:

我有一个 Equal() 方法来查看 OrderNumber 是否已经输入。我不确定如何在 for 循环数组中调用它。

这是我的平等方法

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 方法做任何事情。

我正在尝试将它放在哪里,如果他们输入相同的订单号,它会显示“对不起,订单号 '###' 是重复的。 请重新输入”

任何帮助将不胜感激

【问题讨论】:

  • 你的问题能说得清楚一点吗?你问的是哪一部分?如何采用Equals() 方法覆盖并使用它来确定是否向用户显示控制台消息?或者,当您检测到使用您的 Equals() 覆盖输入了相同的订单时,您是否要问如何打破循环?
  • 我只是想将输入的订单号与之前输入的订单号进行比较。如果它们相同,则会弹出消息。我不知道该怎么做,认为 equals 方法是最好的方法。
  • 如果你覆盖Equals,请确保你也覆盖GetHashCode。如果您选择使用HashSet 来跟踪以前的订单,这一点尤其重要。见msdn.microsoft.com/en-us/library/336aedhh.aspx

标签: c# arrays inheritance methods equals


【解决方案1】:

您可以尝试使用HashSet&lt;ShippedOrder&gt; 代替数组。并使用它的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
   ...
}

【讨论】:

  • 谢谢,我对 c# 和 equal/gethash 方法还很陌生。如何在我的代码中实现 HashSet
  • @Joel 看到我的编辑。此外,MSDN 页面中有一个示例,您可以随时搜索 HashSet 的更多示例。
【解决方案2】:

此 linq 查询可能有效。

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

【讨论】:

  • 如果你只需要一个匹配,.Any() 比使用 Count() 更可取,因为 Any 将在第一个匹配处停止并且更清晰:)
  • 是的,但我正在寻找两个或更多匹配项。
  • 感谢您的帮助,如何将其添加到 forloop 中?
  • 将它放在 for 循环中的任何位置,并用 if 语句跟进。如果 isDupe 为真,打印警告信息并跳出循环。
猜你喜欢
  • 1970-01-01
  • 2015-01-26
  • 2014-02-15
  • 2021-10-28
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 2012-04-16
  • 2021-09-26
相关资源
最近更新 更多