早上好专家
我有一个组合框,里面装有类类型值。
我的班级名称是汽车。
public string Description;
public long Id;
我加载组合框的功能是
foreach(Cars car in CarList)
{
comboCars.Items.Add(car);
}
我有一个需要在该组合框中搜索汽车的函数,我有此代码。
public void setCarCmb(long id)
{
for (int i = 0; i < comboCars.Items.Count; i++)
{
if (((Cars)comboCars.Items[i]).Id == id)
{
comboCars.SelectedIndex = i;
comboCars.Enabled = false;
break;
}
}
}
哪个可行,但我试图找到一种更好,更快的方法,我尝试使用
public void setCarCmb(Cars car)
{
comboCars.SelectedIndex = comboCars.Items.IndexOf(car);
comboCars.Enabled = false;
}
但是返回的索引始终为-1,这似乎有什么问题?
答案 0 :(得分:1)
行
comboCars.SelectedIndex = comboCars.Items.IndexOf(car);
尝试在组合框项目中找到car
对象的索引。但是,仅仅因为两个对象具有相同的属性值,并不意味着它们是同一对象。以下面的示例为例。
Car car1 = new Car() { Id = 1, Description = "MyCar" };
Car car2 = new Car() { Id = 1, Description = "MyCar" };
bool equality = car1 == car2;
此代码将返回false
,因为尽管这两个对象的内容相同,但它们仍然是两个不同的对象。
您的IndexOf()
比较中也发生了同样的事情,由于它无法在组合框中找到要传递的对象,因此它返回-1
,表示“不匹配”。
在工作示例中寻找对象的方式很好。
如果您确实想使用类似SetCarCmb
的方法,则可以在IEquatable<T>
类中实现Car
接口,如下所示:
public class Car : IEquatable<Car>
{
public string Description;
public long Id;
public bool Equals(Car other)
{
// Choose what you want to consider as "equal" between Car objects.
// For example, equality of ID means two objects are equal in this example.
if (other == null)
return false;
return Id == other.Id;
}
}
现在,IndexOf()
方法将不使用两个比较器来比较Car
类的两个对象,而不是比较两个对象引用。因此,您将像这样修改您的方法:
public static void SetCarCmb(Car car)
{
comboCars.SelectedIndex = comboCars.Items.Cast<Car>().ToList().IndexOf(car);
comboCars.Enabled = false;
}
但是实际上,没有必要去解决所有这些麻烦。您的第一种方法应该可以正常工作,尤其是考虑到组合框不可能容纳成千上万个项目,并且效率根本不是问题。
答案 1 :(得分:0)
第二种方法不起作用的原因是因为IndexOf
方法正在作为参数传递的汽车之间进行 引用 比较和组合框中的汽车,但找不到完全匹配的内容(参考比较意味着两个对象都指向内存中的相同位置)。
您的新方法以其当前形式起作用的唯一方法是,如果您从CarsList
(这是组合框绑定到的同一辆车)上驶入一辆车。
如果您希望能够传递具有相同ID(和/或描述)并匹配的其他汽车,则需要覆盖Equals
方法,以便仅比较这些方法字段(而不是进行参考比较),以便IndexOf
可以正常工作:
public class Car
{
public string Description { get; set; }
public long Id { get; set; }
// Consider any other car whose Id is the same as this car to be equal
public override bool Equals(object obj)
{
var other = obj as Car;
return other?.Id == Id; // optionally add: && other.Description == Description;
}
}
更改之后,您的新方法应该可以正常工作。