我正在编写一个C#应用程序,其中我使用类型为
参考代码中,
然而,
我的
Airport
的对象列表来填充DataGridView
。我目前正在编写按下按钮后删除一个对象的方法。参考代码中,
dgvF
是包含Flights List<Flights>
的DataGridView
,我还有一个dgvA用于我的Airports List<Airports>
。private void bajaAeropuerto_Click(object sender, EventArgs e)
{
String c = city.Text;
String id = idAirport.Text;
Airport delete = new Airport(c, id);
//Select all Flights which reference the "delete" airport
foreach (DataGridViewRow row in listaVuelos.Rows)
{
Flight v = (Flight)row.DataBoundItem;
Airport aO = v.fromCity;
Airport aD = v.toCity;
if(delete.Equals(aO) || delete.Equals(aD))
{
dgvF.MultiSelect = true;
row.Selected = true;
}
}
if (airports.Contains(delete))
{
airports.Remove(delete);
}
else
{
//show message airport doesn't exist
}
dgvAirports.Update();
dgvAirports.Refresh();
}
然而,
if(delete.Equals(aO) || delete.Equals(aD))
和 if (airports.Contains(delete))
这两行代码从未返回true。我在调试模式下运行应用程序,尽管有一刻delete
的值是 {"TIJ- Tijuana"}
而 aD
的值是 {"TIJ - Tijuana"}
,但布尔运算仍然返回false
。我不知道为什么,这是因为我的.toString()
方法重写了吗?因为我需要它在我的飞行操作的DataGridView
中显示完整的机场名称。我的
Airport
和Flight
类定义如下:class Airport
{
public String city{ get; set; }
public String id { get; set; }
public Airport(String ciudad, String id)
{
this.city = city;
this.id = id;
}
public override string ToString()
{
return id + "- " + city; //Ej. MX- Mexico City
}
}
并且
class Flight
{
public String id { get; set; }
public Airport fromCity{ get; set; }
public Airport toCity { get; set; }
public int price{ get; set; }
public Flight(String id, Aeropuerto origen, Aeropuerto destino, int precio)
{
this.id = id;
this.fromCity = origen;
this.toCity = destino;
this.price= precio;
}
}
ReferenceEquals
... 您应该实现自己的Equals
。 - Patrick Hofmanobject.Equals
调用第一个成员的Equals
,因此如果该方法被重写,它会调用那个重写的方法。 - Patrick HofmanEquals
仅适用于struct
- 如果您将Airport
类更改为struct
,则a == b
将执行值比较,而在类上,则默认执行引用比较。 您可以重写相等运算符以及Equals
和GetHashCode
方法(如果需要更改其中一个,则应始终重写所有这些方法)。 - Luaan