为什么IndexOf
无法在List
中找到此代码中的最后一个元素?
public List<Rule> rules = new List<Rule>();
Rule n = new Rule();
rules.Add(n);
Console.WriteLine(n == rules.Last<Rule>()); //True
dg_main.SelectedIndex = rules.IndexOf(n); //-1
答案: 谢谢大家的时间。 我对这种情况非常困惑,以至于我甚至没有看到它不是IndexOf的错。 改变索引的是dg_main.SelectedIndex。 DataGrid已经过排序。
答案 0 :(得分:2)
IndexOf,如here所示,使用EqualityComparer的.Equals方法,它使用EqualityComparer.Default,产生this比较器。如您所见,它使用.Equals方法,而不是相等运算符。
这样做的一个重要原因是,与所有运算符一样,相等运算符是静态的,因此除非编译器在编译时具有正确的类型,否则无法正确调用所需的运算符。
这里最简单的解决方法是实现.Equals并使其调用相等比较器。
// Equals overload for Rule objects
public bool override Equals(object obj)
{
if(obj is Rule)
return (Rule)obj == this; // Type cast here to ensure the right equality operator is called
else return base.Equals(obj);
}
答案 1 :(得分:0)
我认为你在代码中没有显示错误,因为下面的代码是正确的:
[Test, Explicit]
public void Test()
{
List<Rule> rules = new List<Rule>();
Rule n = new Rule();
rules.Add(n);
Assert.AreEqual(n , rules.Last());
Assert.AreEqual(0, rules.IndexOf(n));
}